سؤال

ماذا يعني هذا من التوصية العامة # 3؟

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

يمكن للشخص أن يفسر عن طريق أمثلة من فضلك؟

-- مصدر: MSDN - أفضل الممارسات المدارة

هل كانت مفيدة؟

المحلول

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

while( !quit ) {
    WaitForWork();
    GetWorkItem();
    ExecuteWorkItem();
}

هذا هو النهج الذي من المفترض أن تأخذه، وفقا للتوصية.

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

نصائح أخرى

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

.NET 4.0 لديه مدمج جديد مهمة من الدرجة التي تحتوي على مجموعة من الفئات الداعمة لجعل هذا النمط من البرمجة أسهل حتى لا تضطر إلى إعادة اختراع هذا في كل مشروع.

أعتقد أن هذه التوصية قد تشير أيضا إلى إنشاء مؤشر ترابط، ثم استدعاء الأساليب مرارا وتكرارا Suspend و Resume على ذلك للتحكم عندما يعمل.

يعتبر بشكل عام شكل أفضل لإعدام مؤشر الترابط while حلقة تحتوي على نوع من قفل البدائية (مثل ManualResetEvent أو بعض البدائية المماثلة) للإشارة إلى الخيط عندما يكون هناك المزيد من العمل الذي يتعين القيام به.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top