В чем разница между использованием пула потоков и обычного потока?
==================================================================

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

 [C #, IAsyncResult и пул потоков](https://stackoverflow.com/questions/442991/c-iasyncresult-and-the-thread-pool)

 Вопрос, который задают - это метод X с использованием пула потоков или с использованием обычных потоков.

 В чем разница между пулом потоков и обычным потоком?

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

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

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

 **Когда не использовать потоки пула потоков**

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

 Вам нужна тема переднего плана (!).

 Вы хотите, чтобы поток имел определенный приоритет.

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

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

 Вам нужно иметь стабильную идентификацию, связанную с потоком, или назначить поток задаче.

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

A `ThreadAbortException` добавляется в поток пула потоков, потому что`Abort` назывался

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

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

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

 [Пул управляемых потоков](https://msdn.microsoft.com/en-us/library/0ka9477y.aspx)

 [Прочитав в C #](http://www.albahari.com/threading/)

 [Программирование пула потоков в .NET Framework](https://msdn.microsoft.com/en-us/library/ms973903.aspx)

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



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



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

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

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

Посмотри это[стать](https://msdn.microsoft.com/en-us/library/ms973903.aspx) о пуле потоков



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