سؤال

لنفترض أنني قد وضعت في قائمة انتظار عنصر عمل في ThreadPool, ، ولكن كتل عنصر العمل إذا لم يكن هناك بيانات لمعالجة (قراءة من BlockingQueue). إذا كانت قائمة الانتظار فارغة، فلن يكون هناك المزيد من العمل يحدث في قائمة الانتظار، ثم يجب أن أسمي Thread.Interrupt الطريقة إذا كنت أرغب في مقاطعة مهمة الحظر، ولكن كيف يفعل المرء نفس الشيء مع ThreadPool?

قد يبدو الكود مثل هذا:

void Run()
{
    try
    {
        while(true)
        {
            blockingQueue.Dequeue();
            doSomething();
        }
    }
    finally
    {
        countDownLatch.Signal();
    }
}

أنا أدرك أن أفضل شيء يجب القيام به في هذا الموقف هو استخدام منتظم Thread, ، لكنني أتساءل عما إذا كان هناك ThreadPool طريقة مكافئة لتقاطع عنصر العمل.

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

المحلول

أي BlockingQueue هل هذا؟ هل هذا فئة BCL؟ فئة TPL؟ أو مخصص؟

لا يهم؛ ببساطة - لن أفعل. أنت استطاع افعل شيئا ما في وقت مبكر من حياة الخيط لتخزين مرجع الخيط، لكنني ببساطة لن أستخدم ThreadPool لهذه الوظيفة لأنها تبدو وكأنها قيد التشغيل. عادي Thread سوف يبدو أكثر ملاءمة.

أنا مندهش أيضا أنه لا توجد طريقة محملة لإخبار قائمة الانتظار لإصدار جميع العمال - لقد كتبت قوائم الانتظار المحظورة من قبل، وأنا أميل إلى استخدام النمط (على سبيل المثال، من هنا):

public bool TryDequeue(out T value) {...}

مع هذا:

  • إرجاع صحيح على الفور إذا كانت هناك بيانات
  • حظر و (في نهاية المطاف) العودة TRUE إذا لم تكن هناك بيانات ولكن يتم إضافة بعض
  • حظر و (في نهاية المطاف) إرجاع خطأ إذا تم إغلاق قائمة الانتظار
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top