C # Можно ли прервать конкретный поток внутри ThreadPool? - PullRequest
3 голосов
/ 12 марта 2010

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

Код может выглядеть так:

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

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

1 Ответ

2 голосов
/ 12 марта 2010

Что это за BlockingQueue? Это класс BCL? Класс TPL? Или на заказ?

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

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

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

с этим:

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