Общая рекомендация № 3 - PullRequest
1 голос
/ 04 июня 2009

Что это означает из Общей рекомендации № 3?

Не контролируйте казнь работника темы из вашей основной программы (используя события, например). Вместо этого дизайн ваша программа так что рабочие потоки несут ответственность за ожидание до работы доступен, выполняя его, и уведомление других частей вашей программы когда закончите. Если ваши рабочие темы не блокируйте, рассмотрите использование потока бассейн темы. Monitor.PulseAll is полезно в ситуациях, когда работник блок темы.

Может кто-нибудь объяснить на примерах, пожалуйста?

- Источник: MSDN - Рекомендации по управлению потоками

Ответы [ 3 ]

2 голосов
/ 09 июня 2009

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

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

Это подход, который вы должны использовать согласно рекомендации.

Другой подход - поддерживать очередь работников. Когда у вас есть работа, которую вам нужно сделать, вы забираете работника из очереди (или создаете его, если он пуст) и приказываете ему запустить элемент. Этот второй подход более сложен для кодирования и, как правило, менее эффективен.

1 голос
/ 04 июня 2009

Я понимаю, что это означает, что вы не должны вручную создавать рабочие потоки для обработки задач (например, сохранять файл), а иметь систему на месте (или использовать ThreadPool.QueueUserWorkItem ), где вы можете поставьте в очередь задачу / задание, и существующий работник ожидает прибытия задачи (возможно, с помощью монитора Wait или AutoResetEvent). Поступая таким образом, вы можете повторно использовать потоки, а не постоянно создавать и уничтожать их.

.NET 4.0 имеет новый встроенный класс Task с кучей поддерживающих классов, чтобы упростить этот стиль программирования, чтобы вам не приходилось заново изобретать его в каждом проекте.

0 голосов
/ 05 июня 2009

Я думаю, что эта рекомендация также может относиться к созданию потока, а затем к неоднократному вызову таких методов, как Suspend и Resume, для управления его выполнением.

Обычно считается лучшей формой, чтобы поток выполнял цикл while, который содержит некоторый блокирующий примитив (такой как ManualResetEvent или некоторый подобный примитив), чтобы сигнализировать потоку, когда нужно выполнить больше работы.

...