2009-06-29 3 views
14

Я читал случайные вопросы и ответы здесь на SO и наткнулся на этот вопрос:В чем разница между использованием пула потоков и нормальным потоком?

C#, IAsyncResult and the thread pool

Спрашивается является метод X, используя пул потоков или с помощью обычных нитей.

В чем разница между использованием пула потоков и нормальной нитью?

ответ

19

Пульт потока, как правило, подходит для задач с коротким ходом. У этого есть ограничение, что это ограниченный ресурс приложения (25 на процессор), и есть много внутренних классов, которые используют threadpoool, поэтому, если вы выполняете много длительных задач, вы будете использовать все потоки.

Для длительных задач лучше использовать созданный вручную поток, с его фоновым свойством, равным true.

Примечания: В .NET Framework версии 2.0, значение Thread.CurrentPrincipal свойства распространяются на рабочие потоки в очередь с использованием методы QueueUserWorkItem. В более ранних версиях основная информация не распространяется.

Если не использовать пул потоков Темы

Есть несколько сценариев, в которых целесообразно создавать и управлять своими собственными темы, вместо того, чтобы использовать пул потоков темы:

  • Вам требуется передняя резьба (!).

  • Для того,

  • У вас есть задачи, которые заставляют поток блокироваться в течение длительных периодов времени. Пул потоков имеет максимальное количество потоков, поэтому большое количество заблокированных потоков пула потоков может помешать запуску задач.

  • Необходимо разместить темы в однопоточной квартире. Все потоки ThreadPool находятся в многопоточной квартире.

  • Необходимо иметь устойчивое удостоверение, связанное с потоком, или посвятить поток задаче.

Одна большая разница в том, что Необработанные исключения на резьбе пула потоков завершения процесса; с этими тремя исключениями:

  • ThreadAbortException выбрасывается в поток пула потоков, потому что Abort называли.

  • AppDomainUnloadedException забрасывается в поток пула потоков, поскольку домен приложения выгружается.

  • Общая продолжительность выполнения сеанса или хост-процесс завершает поток.

Некоторые хорошие ссылки:

The Managed Thread Pool

Threading in C#

Programming the Thread Pool in the .NET Framework

Update: в ответ на замечания. Вы можете использовать метод GetAvailableThreads для определения фактического количества потоков в пуле потоков в любой момент времени. ThreadPool.GetMaxThreads - это другое количество. Его максимальное допустимое количество в пуле до того, как запросы поставлены в очередь, а не фактическое количество потоков, находящихся в настоящее время в пуле.

+0

Согласно документации, пул поддерживает 250 рабочие потоки на процессор по умолчанию. –

+0

Некоторым задачам с длительным сроком выполнения может потребоваться, чтобы свойство background устанавливало значение false, если вы хотите, чтобы ваш поток завершил работу до закрытия приложения (конечно, это не гарантирует его, но по крайней мере он не будет закрываться при обычных обстоятельствах) – JoshBerke

+0

@Fredrik Mörk: этот звук как опечатка. Это 25 на ядро ​​ –

0

Threadpool создает потоки и работает в свободной теме. Таким образом, создание и удаление потоков для каждого рабочего элемента предотвращается, поскольку создание и удаление потоков - это относительно дорогостоящая операция.

3

ThreadPool содержит ряд потоков, которые готовы к использованию, что может исключить затраты на создание новых потоков, что и происходит при создании нормального потока.

7

Разница не между самими нитями, поскольку они будут вести себя одинаково, разница в том, кто управляет временем жизни потока и как вы их используете.

Threadpool in .net - это пул потоков, который будет расти или уменьшаться, когда вы ставите очередь на пул потоков для обработки, он определит, нужно ли начинать новый поток или повторно использовать существующий. Вам не нужно явно создавать потоки.

Это хорошо, но недостатком этого является ограниченное количество потоков, доступных в потоковом пуле, поэтому, если вы ставите в очередь длинную задачу, это может оказать негативное влияние на ваше приложение, поскольку вы можете использовать threadpool, что-то еще может использовать.

Смотрите эту article о пуле потоков

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