Пульт потока, как правило, подходит для задач с коротким ходом. У этого есть ограничение, что это ограниченный ресурс приложения (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
- это другое количество. Его максимальное допустимое количество в пуле до того, как запросы поставлены в очередь, а не фактическое количество потоков, находящихся в настоящее время в пуле.
Согласно документации, пул поддерживает 250 рабочие потоки на процессор по умолчанию. –
Некоторым задачам с длительным сроком выполнения может потребоваться, чтобы свойство background устанавливало значение false, если вы хотите, чтобы ваш поток завершил работу до закрытия приложения (конечно, это не гарантирует его, но по крайней мере он не будет закрываться при обычных обстоятельствах) – JoshBerke
@Fredrik Mörk: этот звук как опечатка. Это 25 на ядро –