Вопрос по multithreading, c#, c#-4.0, threadpool – ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew

71

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

ThreadPool.QueueUserWorkItem

против

Task.Factory.StartNew

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

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

Ваш Ответ

1   ответ
87

вам следует указатьTaskCreationOptions.LongRunning, что будет означать этоне запланируйте это в пуле потоков. (РЕДАКТИРОВАТЬ: Как отмечено в комментариях, этоявляется решение, специфичное для планировщика, и не является твердой и быстрой гарантией, но я надеюсь, что любой разумный производственный планировщик избежит планирования долгосрочных задач в пуле потоков.)

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

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

Лично, если бы у меня была возможность, я бы определенно использовал TPL на том основании, чтоTask API довольно хороший - ноделать не забудьте сообщить TPL, что вы ожидаете, что задача будет выполняться в течение длительного времени.

РЕДАКТИРОВАТЬ: Как отмечено в комментариях, см. Также сообщение в блоге команды PFX навыбор между TPL и пулом потоков:

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

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

РЕДАКТИРОВАТЬ: Также из комментариев, не забывайте, что TPL позволяет вам использоватьнастраиваемые планировщики, если вы действительно хотите ...

@Marc: Хорошо, это зависит от планировщика, но было бы довольно сумасшедшим планировщиком планировать явно длительные задачи в пуле потоков, IMO. Jon Skeet
@Brad: Спасибо, добавлю ссылку на мой ответ. Jon Skeet
Я настороженно отношусь к жесткому правилуTaskCreationOptions.LongRunning всегда будет избегать пул потоков. Кажется, это скорее директива, чем гарантия реализации. Я вне базы по этому поводу? Marc
Я бы также добавил, что TPL позволяет вам указать свой собственный планировщик, включая настраиваемые планировщики, которые позволяют вам контролировать свой собственный параллелизм:msdn.microsoft.com/en-us/library/ee789351.aspx Chris Shain
Просто чтобы добавить немного больше информации -blogs.msdn.com/b/pfxteam/archive/2009/10/06/9903475.aspx Brad Semrad

Похожие вопросы