كيف تضيف مهام الوظائف ذات الأولوية
-
28-09-2019 - |
سؤال
يمكنني استخدام مكتبة المهام لخدمة ضغط الصور الخاصة بي. أود أن تضغط على العديد من الملفات التزامن. لكني أريد تشغيل الخدمة فقط عندما يكون المستخدم في وضع الخمول (أو لا مزيد من المهمة impotarnt في البرنامج).
أعلم أن ThreadPool لا يدعم ميزة "تغيير مؤشر الترابط الأولوية" ، لذلك تدعم المهمة هذه الميزة أيضًا.
هل يمكنني تطوير هذه الوظيفة على مستوى أعلى من التحكم؟ (أولوية TaskScheduler على سبيل المثال)
المحلول
كما ذكر Zengr ، يمكنك استخدام نمط قائمة انتظار الأولوية لحل هذه المشكلة. هناك في الواقع عينة جيدة في MSDN لتنفيذ قوائم انتظار الأولوية باستخدام ConcurrentQueue<T>
مثيلات لكل أولوية ثم لف ذلك بعرف IProducerConsumerCollection<T>
التنفيذ الذي يسحب العناصر من قائمة انتظار الأولوية العليا قبل أقل. يمكّن هذا النوع من التنفيذ منتجك من تحديد عدد الأولويات التي يجب أن تكون هناك ، وتعيين الأولوية عند إضافة العنصر ويتيح للمستهلكين العمل على العناصر ذات الأولوية القصوى أولاً دون الحاجة إلى فهم خوارزمية الأولوية.
نصائح أخرى
يمكنك إنشاء مخصص TaskScheduler
للمكتبة الموازية للمهمة ثم جدولة المهام على ذلك عن طريق تمرير مثيل لها إلى TaskFactory
البناء.
إليك مثال واحد على كيفية القيام بذلك: جدولة المهام ذات الأولوية