ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew

какая разница между ниже

ThreadPool.QueueUserWorkItem

против

Task.Factory.StartNew

Если вышеупомянутый код называется 500 раз для какой-то длительной задачи, означает ли это, что все потоки пула потоков будут заняты?

Или будет ли TPL (2-й вариант) достаточно умным, чтобы просто занимать потоки меньше или равняться количеству процессоров?

Ответ 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 позволяет вам использовать настраиваемые планировщики, если вы действительно хотите...