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

15

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

C #, IAsyncResult и пул потоков

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

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

Ваш Ответ

4   ответа
21

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пул управляемых потоков

Прочитав в C #

Программирование пула потоков в .NET Framework

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

Согласно документации, пул поддерживает 250 рабочих потоков на процессор по умолчанию. Fredrik Mörk
Некоторым долго выполняющимся задачам может потребоваться установить для свойства background значение false, если вы хотите, чтобы ваш поток завершил свою работу до закрытия приложения (конечно, это не гарантирует, что оно будет закрыто, но, по крайней мере, не закроется при нормальных обстоятельствах). ) JoshBerke
@ Fredrik Mörk: это звучит как опечатка. Это 25 на ядро Mitch Wheat
@ Mitch: я только что проверил, вызвав ThreadPool.GetMaxThreads, он возвращает 500 (на двухъядерной машине). Fredrik Mörk
@ Mitch Wheat @ Джош, это не тип, число отличается в зависимости от версии фреймворка Kev Hunter
7

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

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

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

Посмотри этостать о пуле потоков

3

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

0

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

Похожие вопросы