Ответ 1
Пул потоков обычно подходит для задач с коротким ходом. У этого есть ограничение, что это ограниченный ресурс приложения (25 на процессор), и есть много внутренних классов, которые используют threadpoool, поэтому, если вы выполняете много длительных задач, вы будете использовать все потоки.
Для длительных задач лучше использовать созданный вручную поток, а его фоновое свойство равно true.
Примечание. В версии .NET Framework версии 2.0 значение свойства Thread.CurrentPrincipal
передается в рабочие потоки, помещенные в очередь с использованием метода QueueUserWorkItem
. В более ранних версиях основная информация не распространяется.
Когда не использовать потоки пула потоков
Существует несколько сценариев, в которых целесообразно создавать и управлять своими потоками вместо потоков потоков потоков:
-
Вам нужен поток переднего плана (!).
-
Для потока требуется определенный приоритет.
-
У вас есть задачи, которые заставляют поток блокироваться в течение длительных периодов времени. Пул потоков имеет максимальное количество потоков, поэтому большое количество заблокированных потоков пула потоков может помешать запуску задач.
-
Вам нужно поместить потоки в однопоточную квартиру. Все потоки ThreadPool находятся в многопоточной квартире.
-
У вас должен быть устойчивый идентификатор, связанный с потоком, или выделенный поток для задачи.
Одно большое отличие заключается в том, что Необработанные исключения в потоках пула потоков завершают процесс; с этими тремя исключениями:
-
A
ThreadAbortException
выбрасывается в поток пула потоков, потому что был вызванAbort
. -
В поток потока пула добавляется
AppDomainUnloadedException
, потому что домен приложения выгружается. -
Среда выполнения общего языка или хост-процесс завершают поток.
Некоторые хорошие ссылки:
Программирование пула потоков в .NET Framework
Обновить: в ответ на комментарии. Вы можете использовать метод GetAvailableThreads
для определения фактического количества потоков в пуле потоков в любой момент времени. ThreadPool.GetMaxThreads
- это другое количество. Его максимальное допустимое количество в пуле до того, как запросы поставлены в очередь, а не фактическое количество потоков, находящихся в настоящее время в пуле.