Если вы собираетесь запустить длительную задачу с помощью TPL, вы должны указать TaskCreationOptions.LongRunning
, что будет означать, что она не планирует ее в пуле потоков. (EDIT: Как было отмечено в комментариях, это является решение планировщика конкретным, а не жесткий и быстрый гарантии, но я надеюсь , что любой здравомыслящий производство планировщик позволит избежать планирования долго выполняющихся задач в пуле потоков.)
Вам определенно не следует самостоятельно планировать большое количество длительных задач в пуле потоков. Я считаю, что в наши дни размер пула потоков по умолчанию довольно велик (потому что им часто злоупотребляют подобным образом), но принципиально его не следует использовать таким образом.
Назначение пула потоков - избежать того, чтобы короткие задачи сильно пострадали от создания нового потока по сравнению со временем, в течение которого они фактически выполняются. Если задача будет выполняться в течение длительного времени, влияние создания нового потока в любом случае будет относительно небольшим - и вы не хотите, чтобы потоки пула потоков потенциально заканчивались. (Это менее вероятно, но я сделал испытать его на более ранних версиях .NET.)
Лично, если бы у меня была возможность, я бы определенно использовал TPL на том основании, что Task
API довольно хорош, но не забудьте сказать TPL, что вы ожидаете, что задача будет выполняться в течение длительного времени.
EDIT: как отмечено в комментариях, см. Также сообщение в блоге команды PFX о выборе между TPL и пулом потоков :
В заключение я повторю то, что уже сказал разработчик ThreadPool из команды CLR:
Task is now the preferred way to queue work to the thread pool.
РЕДАКТИРОВАТЬ: Также из комментариев не забывайте, что TPL позволяет использовать настраиваемые планировщики , если вы действительно хотите ...
TaskCreationOptions.LongRunning
которое всегда избегает пула потоков. Похоже, это скорее директива, чем гарантия реализации. Я не в курсе?