2010-03-12 2 views
3

Предположим, что я поставил в очередь рабочий элемент в ThreadPool, но рабочий элемент блокирует, если нет данных для обработки (чтение из BlockingQueue). Если очередь пуста и больше не будет работать в очереди, тогда я должен вызвать метод Thread.Interrupt, если я хочу прервать задачу блокировки, но как сделать то же самое с ThreadPool?C# Возможно ли прервать конкретный поток внутри ThreadPool?

код может выглядеть следующим образом:

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

Я знаю, что лучше всего делать в этой ситуации использовать обычный Thread, но мне интересно, если есть ThreadPool эквивалентный способ прерывание рабочего элемента.

ответ

2

Какой это BlockingQueue? Это класс BCL? Класс TPL? Или обычай?

Неважно; просто - я бы не стал. Вы могли бы сделать что-то в начале жизни нити, чтобы сохранить ссылку на нить, но я просто не использовал бы ThreadPool для этой работы, поскольку кажется, что она больше работает. Правильный Thread будет казаться более подходящим.

Я также удивлен тем, что не существует встроенный метод говорить очереди, чтобы освободить всех рабочих - я написал блокирование очереди раньше, и я, как правило, использовать шаблон (например, from here):

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

с этим:

  • возвращает истину сразу, если есть данные
  • блокировки и (в конечном счете) возвращает истину, если нет данных, но некоторые добавляют
  • блокировка и (в конечном итоге) возврат false, если очередь закрыта.
+0

+1 TryDequeue - это очень хорошее решение проблемы. – Kiril

+0

Энергонезависимая булева переменная (закрывающая), проверенная в коротком цикле, всегда ли работает? –

+0

@nobugz - я * считаю, что 'Monitor.Wait' заставит обновление; интересный вопрос. –

Смежные вопросы