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