مشاركة عبر


كيفية القيام بما يلي: تكرار حلقي متوازى.ForEach والتي انتهت الكتابة مؤشر ترابط-المتغيرات المحلية

يوضح المثال التالي كيف إلى كتابة ForEachالأسلوب الذي يستخدم المتغيرات المحلية مؤشر ترابط. عندما ForEachتنفيذ تكرار حلقي، فإنه يقسم مجموعة المصدر الخاص به في أقسام متعددة. يحصل كل قسم نسخته من "مؤشر ترابط-محلي" متغير. (مصطلح "مؤشر ترابط المحليه" هو غير دقيقة قليلاً هنا، لأن في بعض الحالات قد تعمل قسمين تشغيل نفس مؤشر ترابط.)

تعليمات برمجية والمعلمات في هذا المثال عن قرب تشبه المقابل Forالأسلوب. لمزيد من المعلومات، راجع كيفية القيام بما يلي: تكرار حلقي متوازى.For والتي يحتوي على جزء الترابط-محلي متغيرات الكتابة.

مثال

استخدام مؤشر ترابط-متغير محلي في ForEachتكرار حلقي، يجب عليك استخدام الإصدار الطريقة التي تأخذ الثاني typeمعلمات. تعين معلمة الأولى لنوع العنصر المصدر و معلمة ثانية تحدد نوع المتغير المحلي مؤشر ترابط.

معلمة إدخال أول هو مصدر بيانات، و الثانية هي دالة التي ستقوم بتهيئة متغير محلي مؤشر ترابط. معلمة إدخال الثالث Func<T1, T2, T3, TResult>الذي تم طلبه من قبل تكرار حلقي متوازي تشغيل كل تكرار. قمت بكتابة التعليمة البرمجية للمفوض، ومسارات الحلقة في معلمات إدخال. تكون معلمات إدخال للعنصر الحالي، ParallelLoopStateمتغير التي تمكنك من فحص الولاية الحلقة، و المتغير المحلي مؤشر الترابط. تقوم بإرجاع متغير مؤشر ترابط المحلية، و أسلوب ثم يمرره إلى تكرار التالي تشغيل هذا القسم. وهذا متغير هو مميزة تشغيل الجميع الأقسام تكرار حلقي.

الأخيرة بإدخال معلمة من ForEachأسلوب هو Action<T>المفوض استدعاء الأسلوب عند مكتمل الجميع حلقات. الأسلوب الذي يوفر القيمة النهائية للمتغير المحلي مؤشر ترابط لترتيب هو مؤشر ترابط (أو قسم تكرار حلقي)، والتي توفرها التعليمة البرمجية التي تقوم بتسجيل القيمة النهائية ويقوم بتنفيذ الإجراء الذي تراه هو المطلوبة لضم الناتج من القيم بالموضع هو قسم بالنتائج من الأقسام الأخرى. لأن اكتب المفوض هو Action<T>، هناك هو لا توجد القيمة الإرجاع.

' How to: Write a Parallel.ForEach Loop That Has Thread-Local Variables

Imports System.Threading
Imports System.Threading.Tasks

Module ForEachThreadLocal
    Sub Main()

        Dim nums() As Integer = Enumerable.Range(0, 1000000).ToArray()
        Dim total As Long = 0

        ' First type paramemter is the type of the source elements
        ' Second type parameter is the type of the local data (subtotal)
        Parallel.ForEach(Of Integer, Long)(nums, Function() 0,
                                           Function(elem, loopState, subtotal)
                                               subtotal += nums(elem)
                                               Return subtotal
                                           End Function,
                                            Sub(finalResult)
                                                Interlocked.Add(total, finalResult)
                                            End Sub)

        Console.WriteLine("The result of Parallel.ForEach is {0}", total)
        Console.WriteLine("Press any key to exit.")
        Console.ReadKey()
    End Sub
End Module
namespace ThreadLocalForEach
{
    using System;
    using System.Linq;
    using System.Threading;
    using System.Threading.Tasks;


    class Test
    {

        static void Main()
        {
            int[] nums = Enumerable.Range(0, 1000000).ToArray();
            long total = 0;

            // First type parameter is the type of the source elements
            // Second type parameter is the type of the local data (subtotal)
            Parallel.ForEach<int, long>(nums, // source collection
                                        () => 0, // method to initialize the local variable
                                        (j, loop, subtotal) => // method invoked by the loop on each iteration
                                        {
                                            subtotal += nums[j]; //modify local variable
                                            return subtotal; // value to be passed to next iteration
                                        },
                // Method to be executed when all loops have completed.
                // finalResult is the final value of subtotal. supplied by the ForEach method.
                                        (finalResult) => Interlocked.Add(ref total, finalResult)
                                        );

            Console.WriteLine("The total from Parallel.ForEach is {0}", total);
            Console.WriteLine("Press any key to exit");
            Console.ReadKey();
        }
    }
}

راجع أيضًا:

المهام

كيفية القيام بما يلي: تكرار حلقي متوازى.For والتي يحتوي على جزء الترابط-محلي متغيرات الكتابة

المبادئ

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

لامدا التعبيرات في PLINQ و TPL