потоки ThreadPool.QueueUserWorkItem против задачи.Фабрика.StartNew


в чем разница между ниже

ThreadPool.QueueUserWorkItem

vs

Task.Factory.StartNew

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

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

1 68

1 ответ:

Если вы собираетесь запустить длительную задачу с TPL, вы должны указать TaskCreationOptions.LongRunning, что будет означать это не запланируйте его в пуле потоков. (EDIT: как отмечено в комментариях, это и решение, зависящее от планировщика, и не является жесткой и быстрой гарантией, но я надеюсь, что любой разумный производственный планировщик избежит планирования длительных задач в пуле потоков.)

вы определенно не должны планировать большое количество длительные задачи в пуле потоков самостоятельно. Я считаю, что в наши дни размер пула потоков по умолчанию довольно велик (потому что он часто злоупотребляется таким образом), но в принципе он не должен использоваться таким образом.

точка пула потоков, чтобы избежать короче задачи, принимающие большой удар от создания нового потока, по сравнению с временем, когда они на самом деле работают. Если задача будет выполняться в течение длительного времени, последствием создания нового потока будет относительно маленький в любом случае-и вы не хотите в конечном итоге потенциально запускать потоки пула потоков. (Теперь это менее вероятно, но я сделал испытайте его на более ранних версиях. NET.)

лично если бы у меня была возможность, я бы определенно использовал TPL на том основании, что Task API довольно приятно - но do Не забудьте сказать TPL, что вы ожидаете, что задача будет выполняться в течение длительного времени.

EDIT: как отмечено в комментариях, см. Также сообщение в блоге команды PFX выбор между TPL и пулом потоков:

В заключение я повторю то, что разработчик ThreadPool команды CLR уже заявил:

Task is now the preferred way to queue work to the thread pool.

EDIT: также из комментариев, не забывайте, что TPL позволяет использовать настраиваемые планировщики, если вы действительно хотите...