ThreadPool
имеет ограниченное количество многоразовых нитей.Эти темы используются для задач (например, Task.Run
).Задача, которая выполняется в течение более длительного периода времени, заблокирует поток, чтобы его нельзя было повторно использовать для другого Task
.Таким образом, чтобы всегда иметь достаточно ThreadPool
доступных потоков (например, для async / await, Parallel Linq и т. Д.), Вы должны использовать ThreadPool
независимых потоков для такого рода задач.
Это можно сделать с помощью Task.Factory.StartNew(Action, TaskCreationOptions)
(или любая другая перегрузка, которая принимает объект TaskCreationOptions
) и затем передает параметр TaskCreationOptions.LongRunning
.LongRunning
вызывает новый поток, который не зависит от ThreadPool
.
Таким образом, для всех длительных и основанных на IO задач, таких как чтение файла или базы данных, вы должны использовать ThreadPool
независимые потоки, вызывая Task.Factory.StartNew(() => DoAction(), TaskCreationOptions.LongRunning);
.Вам вовсе не нужно new Thread(runMethod).Start()
. Потоки
ThreadPool
более ресурсоэффективны, поскольку их можно использовать повторно.Таким образом, при извлечении потоков ThreadPool
они уже созданы.Создание новых тем всегда дорогой ресурс.Они должны быть зарегистрированы, стеки вызовов должны быть созданы, локальные пользователи должны быть скопированы и т. Д. Вот почему при рассмотрении производительности предпочтительнее выбирать многоразовые потоки, если рабочая нагрузка легкая (короткая работа).