سؤال

أرغب في تنفيذ مهلة حول تنفيذ المهام في مشروع يستخدم CCR. في الأساس عندما أقوم بنشر عنصر إلى منفذ أو Encueue مهمة لاستئصال الاسترداد، أريد أن أكون قادرا على إحباط المهمة أو الخيط الذي يعمل عليه إذا استغرق الأمر وقتا أطول من بعض الوقت الذي تم تكوينه. كيف يمكنني أن أفعل هذا؟

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

المحلول

هل يمكنك تأكيد ما تسأل؟ هل تقوم بتشغيل مهمة طويلة العمر في المرسل؟ سيقوم بقتل مؤشر الترابط كسر نموذج CCR، لذلك عليك أن تكون قادرا على الإشارة إلى الخيط لإنهاء عملها والعائد. على افتراض أنه حلقة لا تشغل سريعا بما فيه الكفاية، فقد تختار "Enqueue" مؤقتا:

var resultTimeoutPort = new Port<DateTime>();
dispatcherQueue.EnqueueTimer(TimeSpan.FromSeconds(RESULT_TIMEOUT), 
                             resultTimeoutPort);

والتأكد من أن مؤشر ترابط الحظر يتوفر مرجعا إلى نتيجة النتيجة. في حلقة الحظر، قد تكون إحدى شروط الخروج:

do
{
    //foomungus amount of work
}while(resultTimeoutPort.Test()==null&&
       someOtherCondition)

يرجى نشر مزيد من المعلومات إذا كنت تنبح الشجرة الخطأ.

نصائح أخرى

يمكنك تسجيل مؤشر الترابط (Thread.CurrentThread) في بداية معالج CCR الخاص بك "تلقي" (أو بطريقة تستدعي طريقةك عبر مندوب). ثم يمكنك القيام بفحص الدوري وإحباطه إذا لزم الأمر بشكل أساسي بنفس الطريقة التي كنت قد فعلتها إذا قمت بإنشاء مؤشر الترابط يدويا. الصيد هو أنه إذا كنت تستخدم Microsoft.ccr.core.dispatcher الخاص بك مع عدد ثابت من المواضيع، لا أعتقد أن هناك طريقة للحصول على هذه المواضيع مرة أخرى بمجرد إحباطها (بناء على الاختبار الخاص بي). لذلك، إذا كان لدى المرسل الخاص بك 5 خيوط، فستتمكن فقط من إحباط 5 مرات قبل النشر لن يعمل بغض النظر عن المهام التي تم تسجيلها. ومع ذلك، إذا قمت بإنشاء Respatcherqueue باستخدام تجمع Lock CLR، فسيتم استبدال أي مؤشرات ترابط CCR قبالة تلقائيا ولن تواجه هذه المشكلة. من ما رأيته، على الرغم من أنه يوصى بمرسل CCR، أعتقد أن استخدام تجمع Location Clr هو الطريق للذهاب في هذا الموقف.

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