مشاركة عبر


Schedulers مهمة

يتم تمثيل schedulers مهمة بواسطة System.Threading.Tasks.TaskSchedulerفئة. جدولة مهام يتأكد التي العمل لمهمة هو أخيرا بتنفيذها. جدولة المهام الافتراضية هو استناداً إلى ThreadPool 4 "إطار عمل.NET، مما يوفر سرقة بالعمل لموازنة تحميل، مؤشر الترابط ادخال/التقاعد الحد الأقصى سرعة نقل البيانات وأداء جيدا بشكل عام. يجب أن تكون كافية لمعظم سيناريوهات. ومع ذلك، إذا كنت تطلب وظيفة معينة، يمكنك إنشاء جدولة مخصصة و تمكينه لمهام محددة أو الاستعلامات. لمزيد من المعلومات حول كيفية إلى إنشاء واستخدام برنامج جدولة مهام "cusإلىm، راجع كيفية القيام بما يلي: إنشاء برنامج جدولة مهام والتي تحد من درجات تزامن. للحصول تشغيل أمثلة schedulers مخصصة إضافى، راجع ‏‫النماذج ملحقات متوازى تشغيل موقع "معرض تعليمات برمجية الخاص بMSDN تشغيل ويب".

برنامج جدولة المهام الافتراضي ThreadPool

جدولة افتراضية لمكتبة متوازى المهام و PLINQ يستخدم.NET Framework ThreadPoolإلى قائمة الانتظار وتنفيذ العمل. في .NET Framework 4، ThreadPoolتستخدم المعلومات التي يتم توفيرها بواسطة System.Threading.Tasks.Taskنوع لاعتماد parallelism تفصيلية (قصير الأجل وحدات العمل) المتوازية المهام بكفاءة و يستعلم غالباً ما تمثل.

أو ThreadPool قائمة الانتظار العمومية.قوائم الانتظار المحلية

كما في الإصدارات السابقة من برنامج.NET Framework، ThreadPoolيحتفظ FIFO عمومي (الأولى الإضافية، أول-خارج) بعمل قائمة انتظار لمؤشرات الترابط في كل مجال تطبيق. عند استدعاء برنامج QueueUserWorkItem(أوUnsafeQueueUserWorkItem) ، هو العمل وضع قائمة الانتظار هذه مشتركة وأخيراً de-queued تشغيل مؤشر ترابط التالي الذي يصبح متوفراً. في .NET Framework 4، تم تحسين قائمة الانتظار هذه إلى استخدم خوارزمية خالية من قفل مشابهة ConcurrentQueueفئة. باستخدام هذا التطبيق تحرير القفل، ThreadPoolيستغرقه أقل وقت من قائمة انتظار و de-queues عناصر العمل. Th هو من الفائدة للأداء هو متوفرة لكافة البرامج التي تستخدم ThreadPool.

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

يظهر المثال التالي بعض المهام المجدولة في قائمة الانتظار العمومية و غير ذلك المهام المجدولة في قائمة الانتظار المحلية.

Sub QueueTasks()

    ' TaskA is a top level task.
    Dim taskA = Task.Factory.StartNew(Sub()

                                          Console.WriteLine("I was enqueued on the thread pool's global queue.")

                                          ' TaskB is a nested task and TaskC is a child task. Both go to local queue.
                                          Dim taskB = New Task(Sub() Console.WriteLine("I was enqueued on the local queue."))
                                          Dim taskC = New Task(Sub() Console.WriteLine("I was enqueued on the local queue, too."),
                                                                  TaskCreationOptions.AttachedToParent)

                                          taskB.Start()
                                          taskC.Start()

                                      End Sub)
End Sub
void QueueTasks()
{
    // TaskA is a top level task.
    Task taskA = Task.Factory.StartNew( () =>
    {                
        Console.WriteLine("I was enqueued on the thread pool's global queue."); 

        // TaskB is a nested task and TaskC is a child task. Both go to local queue.
        Task taskB = new Task( ()=> Console.WriteLine("I was enqueued on the local queue."));
        Task taskC = new Task(() => Console.WriteLine("I was enqueued on the local queue, too."),
                                TaskCreationOptions.AttachedToParent);

        taskB.Start();
        taskC.Start();

    });
}

يقلل استخدام قوائم الانتظار المحلية ليس فقط من الضغط تشغيل عمومي قائمة الانتظار، فإنه أيضا الاستفادة من بيانات المجتمع المحلي. كثيرا ما قائمة عناصر العمل المحلي الانتظار مرجع بيانات البنى الموجودة فعلياً القريب إلى بعضها البعض في ذاكرة. في هذه الحالات، بيانات موجودة مسبقاً في ذاكرة تخزين مؤقت بعد أول تشغيل مهمة، ويمكن الوصول إليها بسرعة. و LINQ متوازى (PLINQ) Parallelفئة استخدم تتداخل المهام والمهام التابعة بشكل مكثف، وتحقيق speedups كبير بواسطة استخدام قوائم انتظار عمل محلي.

سرقة العمل

The .NET Framework 4 ThreadPool also features a work-stealing algorithm to help make sure that no threads are sitting idle while others still have work in their queues. عند قيام مؤشر ترابط تجمع مؤشرات ترابط جاهز للعمل، فإنه أول عند رأس انتظار محلية، ثم في قائمة الانتظار العمومي، ومن ثم في قوائم الانتظار المحلية من عمليات جزئية الأخرى. إذا وجد عنصر عمل في قائمة الانتظار المحلية لمؤشر ترابط آخر، فإنه يتم تطبيق heuristics أولاً إلى تأكد من أن يمكن تشغيله العمل كفاءة. أن أمكن ذلك، فإنه de-queues العمل العنصر من الخلفي (بترتيب FIFO). This reduces contention on each local queue and preserves data locality. This architecture helps the .NET Framework 4 ThreadPool load-balance work more efficiently than past versions did.

مهام طويلة-تشغيل

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

مهمة Inlining

في بعض الحالات، عند مهمة هو انتظار، فإنه قد يتم تنفيذ شكل متزامن في مؤشر ترابط الذي هو إجراء عملية الانتظار. هذا على تحسين الأداء، كـ يمنع الحاجة مؤشر ترابط إضافى باستخدام مؤشرات الترابط موجود التي قد تم حظره، خلاف ذلك. يحدث من لتجنب الأخطاء بسبب re-entrancy، inlining المهام فقط عند الهدف الانتظار هو في قائمة انتظار محلية مؤشر ترابط ذات الصلة.

تعيين سياق المزامنة

يمكنك استخدام TaskScheduler.FromCurrentSynchronizationContextأسلوب إلى تحديد أنه يجب أن تتم جدولة مهمة إلى تشغيل تشغيل مؤشر ترابط معينة. وهذا مفيد في الإطارات مثل Windows Forms كـ والإدارة الأساسية العرض التقديمي تشغيل Windows الوصول إلى الكائنات واجهة عليه غالباً مقيدة للتعليمات البرمجية التي هي قيد التشغيل تشغيل نفس مؤشر ترابط الكائن الذي واجهة المستخدم w كـ التي تم إنشاؤها. لمزيد من المعلومات، راجع كيفية القيام بما يلي: جدولة العمل في سياق معين المزامنة.

راجع أيضًا:

المرجع

TaskScheduler

المبادئ

مكتبة متوازى مهمة

موارد أخرى

كيفية القيام بما يلي: إنشاء برنامج جدولة مهام والتي تحد من درجات تزامن

كيفية القيام بما يلي: جدولة العمل في سياق معين المزامنة

Factories مهمة