مشاركة عبر


كيفية القيام بما يلي: كتابة تنفيذ تكرار حلقي مستمرة متوازى.ForEach بسيط

يوضح هذا المثال كيفية إلى استخدام Parallel.ForEachتكرار حلقي إلى تمكين parallelism بيانات على أي System.Collections.IEnumerableأو System.Collections.Generic.IEnumerable<T>مصدر بيانات.

ملاحظةملاحظة

يستخدم هذه الوثائق تعبيرات لامدا إلى تعريف التفويضات في PLINQ.إذا لم تكن معتاداً على تعبيرات لامدا في C# أو Visual أساسى، راجع لامدا التعبيرات في PLINQ و TPL.

مثال

' How to: Write a Simple Parallel.ForEach Loop
' IMPORTANT!!!: Add reference to System.Drawing.dll
Imports System.Threading
Imports System.Threading.Tasks
Imports System.Drawing

Module ForEachDemo

    Sub Main()
        ' A simple source for demonstration purposes. Modify this path as necessary.
        Dim files As String() = System.IO.Directory.GetFiles("C:\Users\Public\Pictures\Sample Pictures", "*.jpg")
        Dim newDir As String = "C:\Users\Public\Pictures\Sample Pictures\Modified"
        System.IO.Directory.CreateDirectory(newDir)

        ' Method signature: Parallel.ForEach(IEnumerable<TSource> source, Action<TSource> body)
        ' Be sure to add a reference to System.Drawing.dll.
        Parallel.ForEach(files, Sub(currentFile)
                                    ' The more computational work you do here, the greater 
                                    ' the speedup compared to a sequential foreach loop.
                                    Dim filename As String = System.IO.Path.GetFileName(currentFile)
                                    Dim bitmap As New System.Drawing.Bitmap(currentFile)

                                    bitmap.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone)
                                    bitmap.Save(System.IO.Path.Combine(newDir, filename))

                                    ' Peek behind the scenes to see how work is parallelized.
                                    ' But be aware: Thread contention for the Console slows down parallel loops!!!

                                    Console.WriteLine("Processing {0} on thread {1}", filename, Thread.CurrentThread.ManagedThreadId)
                                    'close lambda expression and method invocation
                                End Sub)


        ' Keep the console window open in debug mode.
        Console.WriteLine("Processing complete. Press any key to exit.")
        Console.ReadKey()
    End Sub
End Module
namespace ForEachDemo
{
    using System;
    using System.Drawing; // requires system.Drawing.dll
    using System.IO;
    using System.Threading;
    using System.Threading.Tasks;

    class SimpleForEach
    {
        static void Main()
        {
            // A simple source for demonstration purposes. Modify this path as necessary.
            string[] files = System.IO.Directory.GetFiles(@"C:\Users\Public\Pictures\Sample Pictures", "*.jpg");
            string newDir = @"C:\Users\Public\Pictures\Sample Pictures\Modified";
            System.IO.Directory.CreateDirectory(newDir);

            //  Method signature: Parallel.ForEach(IEnumerable<TSource> source, Action<TSource> body)
            Parallel.ForEach(files, currentFile =>
            {
                // The more computational work you do here, the greater 
                // the speedup compared to a sequential foreach loop.
                string filename = System.IO.Path.GetFileName(currentFile);
                System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(currentFile);

                bitmap.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
                bitmap.Save(System.IO.Path.Combine(newDir, filename));

                // Peek behind the scenes to see how work is parallelized.
                // But be aware: Thread contention for the Console slows down parallel loops!!!
                Console.WriteLine("Processing {0} on thread {1}", filename,
                                    Thread.CurrentThread.ManagedThreadId);

            } //close lambda expression
                 ); //close method invocation

            // Keep the console window open in debug mode.
            Console.WriteLine("Processing complete. Press any key to exit.");
            Console.ReadKey();
        }
    }
}

ForEachتكرار حلقي عمل مثل Forالحلقة: مجموعة الموارد هو مقسمة والعمل هو تشغيل مؤشرات ترابط متعددة استناداً إلى بيئة النظام. مزيد من المعالجات على النظام، شكل أسرع متوازى تشغيل الأسلوب. وبالنسبة لبعض مجموعات المصدر، تكرار حلقي متسلسلة أو قد يكون أسرع، اعتماداً تشغيل الحجم المصدر، و نوع العمل الذي يتم تنفيذه.

للحصول على مزيد من المعلومات حول متوازى حلقات، راجع كيفية القيام بما يلي: كتابة تنفيذ تكرار حلقي مستمرة متوازى.For بسيط

يمكنك أيضا استخدام LINQ متوازى (PLINQ) إلى المعالجة paralellize لمصادر بيانات IEnumerable. PLINQ تمكنك من استخدام بناء جملة الاستعلام مصرحة للتعبير تكرار حلقي السلوك. لمزيد من المعلومات، راجع متوازى LINQ (PLINQ).

التحويل البرمجي للتعليمات البرمجية

  • نسخ ولصق هذا تعليمات برمجية في Visual Studio2010 "تطبيق وحدة تحكم" مشروع.

  • قم بإضافة مرجع إلى النظام.رسم.dll

  • ضغط F5

راجع أيضًا:

المبادئ

بيانات متوازى ism (مكتبة متوازى المهام)

البرمجة المتوازية في .NET Framework

متوازى LINQ (PLINQ)