потоки ThreadPool.QueueUserWorkItem против задачи.Фабрика.StartNew
в чем разница между ниже
ThreadPool.QueueUserWorkItem
vs
Task.Factory.StartNew
если приведенный выше код вызывается 500 раз для какой-то длительной задачи, означает ли это, что все потоки пула потоков будут заняты?
или TPL (2-й вариант) будет достаточно умным, чтобы просто занять потоки меньше или равное количество процессоров?
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 позволяет использовать настраиваемые планировщики, если вы действительно хотите...