Запускает ли Task.Run (Action) новый идентификатор потока. В ThreadPool больше нет потоков? - PullRequest
0 голосов
/ 05 ноября 2018

Согласно msdn , Task.Run (Action) использует поток в ThreadPool для фактического выполнения действия. Мой вопрос (в виде состояний плитки), запустит ли Task.Run новый поток, если нет ничего доступного в ThreadPool? Или просто подождать, пока он не появится?

[tl; dr] В настоящее время я ставлю некоторые вызовы прямо в ThreadPool:

ThreadPool.QueueUserWorkItem(x => ...);

Но я заметил, что при некоторых нагрузках у приложения заканчиваются потоки в пуле (ошибка Parallel.ForEach где-то еще в программе).

Я знаю, что увеличение количества потоков в пуле, вероятно, ничего не решит, поэтому я думаю использовать MaxDegreeOfParallelism (ParallelOptions) для управления количеством потоков, используемых Parallel.Foreach.

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

Спасибо =]

1 Ответ

0 голосов
/ 05 ноября 2018

запустит ли Task.Run новый поток, если в ThreadPool его нет?

Не сразу. Задача будет поставлена ​​в очередь.

Но ThreadPool управляет своими потоками: при заполнении очереди создаются новые рабочие потоки со скоростью 2 в секунду.

И когда очередь опустеет, потоки будут уничтожены с той же скоростью.

Реальный алгоритм немного сложнее (начиная с .NET 4), но это означает, что в пуле реализовано довольно простое управление ресурсами.

...