مشاركة عبر


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

المهام متوازى مكتبة (TPL) يحتوي على العديد من الطرق التي تقوم بإجراء واحد System.Func<TResult>أو System.Actionعائلة من المفوضون كمعلمات إدخال. استخدم هذه التفويضات لتمرير في منطق البرنامج المخصص الخاص بك إلى متوازى تكرار حلقي "أو" المهام "أو" الاستعلام. تستخدم الأمثلة تعليمات برمجية TPL كذلك PLINQ لامدا التعبيرات، والذي تم تقديمه C# و Visual أساسى في Visual Studio2008، إلى إنشاء مثيلات لهؤلاء المفوضون كتعليمات برمجية مضمنة كتل. هذا الموضوع يوفر مقدمة مختصرة Func وإجراء ويوضح لك كيفية استخدام تعبيرات لامدا في "مكتبة متوازٍ للمهام".

ملاحظةل المزيد من المعلومات حول التفويضات، راجع المفوضين (C# البرمجة الدليل)و المفوضين (Visual Basic). لمزيد من المعلومات حول التعبيرات لامدا في C# و Visual Basic، راجع التعبيرات لامدا (C# البرمجة الدليل)و التعبيرات لامدا.

تفويض Func

Funcالمفوض بتغليف أسلوب التي إرجاع القيمة. في توقيع Func، أو أخير الموجود أقصى اليمين اكتب معلمة دوماً تعيين نوع الإرجاع. لأنها تقوم بإرجاع القيمة Func دائماً يحتوي على معلمة نوع واحد على الأقل. يعرف "مكتبة فئة إطار عمل" إصدارات 17 Func: System.Func<TResult>,System.Func<T, TResult>,System.Func<T1, T2, TResult>، و هكذا حتى من خلالSystem.Func<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, TResult>.

System.Func<T1, T2, TResult>يمكن أن يكون بناء، على سبيل المثال، كـFunc<DateTime, bool, string>في C# أوFunc(Of DateTime,Boolean, String)inVisual Basic. يحتوي هذا الإصدار من Func معلمتين من معلمات إدخال، على System.DateTimeو منطقي (منطقية)، و إرجاع سلسلة (سلسلة). يوضح المثال التالي الأسلوب (الدالات) له توقيع تطابق هذا المفوض تعبير lambda التي تعرف نفس سلوك كالأسلوب:

' Function: 
Function GetDateString(ByVal dt As DateTime, ByVal longString As Boolean) As String
        If longString = True Then
            Return dt.ToLongDateString
       Else
            Return dt.ToShortDateString
       End If
    End Function
' Lambda Expression:
    Function(dt, flag)
        If flag = True Then
            Return dt.ToLongDateString
        Else
            Return dt.ToShortDateString
        End If
    End Function
// Method:
string GetDateString(DateTime dt, bool longString )
       {
           if (longString == true)
               return dt.ToLongDateString();
           else
                return dt.ToShortDateString();
       }
// Lambda Expression (<input parameters> => <body>) :
            (dt, flag) =>
           {
               if (flag == true)
                   return dt.ToLongDateString();
               else
                    return dt.ToShortDateString();
           }

تفويض إجراء

System.Actionتفويض تغليف أسلوب (منخفض في Visual Basic) الذي لا يقوم بإرجاع القيمة أو إرجاع خالية . في أحد التواقيع نوع إجراء، تمثل معلمات نوع معلمات إدخال فقط. مثل Func، يعرف "مكتبة فئة إطار عمل" إصدارات إجراء، 17 من الإصدار له لا اكتب معلمات لأعلى من خلال الإصدار يحتوي على معلمات نوع 16. عند استخدام تعبير lambda لإنشاء إجراء تفويض، infers المحول البرمجي نوع استناداً إلى العدد معلمات إدخال الذي تحدده في التعبير لامدا.

System.Actionهو اكتب عام لا لأنها تتطلب معلمات نوع لا. يمكن أن يتم التفاف أي أسلوب يقبل معلمات إدخال غير و تقوم بإرجاع قيمة فارغة . System.Action<T1, T2, T3>تغليف أسلوب التي تأخذ ثلاث معلمات إدخال. يمكن أن يكون بناء، على سبيل المثال، كـ Action<int, int, string>في C# أو Action (Of Integer, Integer, String)في Visual Basic. كـ مع Func، أي التعرف يمكن استخدام نوع كـ معلمة نوع. يوضح مقطع التالي مثالاً إجراء تفويض في For()الأسلوب.

قم بإنشاء مثيلات Func و إجراء باستخدام "التعبيرات لامدا"

عند أسلوب مثل كـ Parallel.Forيأخذ مفوض Func أو إجراء كـ معلمة إدخال، يمكنك توفير هذه معلمة باستخدام تعبير lambda. المحول البرمجي infers أنواع المتغيرات داخل تعبير lambda ويحول تعبير lambda إلى مثيل للمفوض.

عند التعليمة البرمجية التعبير لامدا، هو هامة لفهم ما إذا كان المحول البرمجي هو توقع Func أو مفوض إجراء "; th هو يخبرك ما إذا كان آخر اكتب معلمة هو القيمة الإرجاع أو إدخال. يجب أيضا المحافظة على ترتيب معلمات إدخال. التحميل الزائد التالي على سبيل المثال، من For()يتخذ إجراء تفويض مع معلمات الثاني. أول هو من نوع العدد الصحيح والثاني هو من نوع System.Threading.Tasks.ParallelLoopState. إذا قمت بتحديد ParallelLoopState كعن طريق الخطأ أول المعلمة، المحول البرمجي لن تكون قادراً على مطابقة التعبير لامدا لأي من التحميلات الزائدة من For(). لاحظ أن تفويض الإجراء هو تسمى نص لأن المفوض بتعريف سلوك الحلقة.

Parallel.For(fromInclusive As Integer, toExclusive As Integer, body As Action ( Of Integer, ParallelLoopState)) As ParallelLoopResult
ParallelLoopResult Parallel.For(int fromInclusive, int, toExclusive, Action<int, ParallelLoopState> body);

نوع عام تفويض هو System.Action<T1, T2>وفي هذا المثال هو نوعه constructed إجراء < Int ، ParallelLoopState> في C# أو إجراء (من عدد صحيح, System.Threading.Tasks.ParallelLoopState) في Visual Basic. أول معلمة القيمة تكرار التكرار حلقي الحالي، ومعلمة ثانية إنشاء مثيل وقت التشغيل ParallelLoopStateالكائن الذي يقوم بتخزين معلومات حول تنفيذ تكرار حلقي عبر الجميع عمليات جزئية. على سبيل المثال، IsStopped()الخاصية إلى ما إذا كان أي واحد عمليات جزئية h كـ تسمى Stopالأسلوب، والذي يشير إلى أنه يجب على الجميع عمليات جزئية إيقاف التكرار كـ قريبا كـ ملائماً.

في معظم الحالات، يمكنك فقط السماح تكرار حلقي نفسه بمراقبة IsStopped()خاصية خلف المشاهد. ومع ذلك، إذا كان لديك قطعة تشغيلها لفترة طويلة من تعليمات برمجية في نص الحلقة، يمكن فحص تلك التعليمة البرمجية IsStopped()خاصية دورياً بترتيب إلى قطع من تكرار حلقي sooner.

يظهر المثال التالي بسيط أسلوب الذي يطابق توقيع المفوض:

Sub UpdateValue(ByVal iteration As Integer, ByVal loopState As ParallelLoopState)
       If someCondition = True
           loopState.Stop()
       End If

       If loopState.IsStopped <> False Then
            nums(iteration) = nums(iteration) * 2
       End If
    End Sub
void UpdateValue(int iteration, ParallelLoopState loopState)
{
    if(someCondition == true)
   {
        loopState.Stop();
        return;
    }

    if (loopState.IsStopped == false)
        nums[iteration] *= 2;
}

يلي مثال تظهر تعبيرات لامدا المطابقة:

Sub(i, loopState)
        If someCondition = False Then
            loopState.Stop() 
        End If

        ' was the loop stopped on another thread?
        If loopState.IsStopped = False Then
            nums(i) = nums(i) * 2
        End If
       End Sub ' close the lambda sub
(i, loop) =>
    {
        if (someCondition == true)
            loop.Stop();

        // Was the loop stopped on another thread?
        if(loop.IsStopped == false)
            nums[i] *= 2; 
    } // Close the lambda.

ويوضح المثال التالي كيفية إلى تمرير مضمنة التعبير لامدا كمعلمة الثالث من For()استدعاء الأسلوب:

Parallel.For(0, nums.Length, Sub(i, loopState)
        If someCondition = False Then
            loopState.Stop() 
        End If

        ' was the loop stopped on another thread?
        If loopState.IsStopped = False Then
            nums(i) = nums(i) * 2
        End If
       End Sub ' close the lambda sub
     ) ' close the method
Parallel.For(0, nums.Length, (i, loop) =>
    {
        if (someCondition == true)
            loop.Stop();

        // Was the loop stopped on another thread?
        if(loop.IsStopped == false)
            nums[i] *= 2; 
    } // Close the lambda.
); //close the method

راجع أيضًا:

المبادئ

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