ThreadPool.QueueUserWorkItem vs Task.Factory.StartNew

下面有什么区别

ThreadPool.QueueUserWorkItem 

VS

 Task.Factory.StartNew 

如果上面的代码被称为500次的一些长时间运行的任务是否意味着所有的线程池线程将被占用?

或者TPL(第二选项)是否足够聪明,可以占用less于或等于处理器数量的线程?

如果要使用TPL启动长时间运行的任务,则应指定TaskCreationOptions.LongRunning ,这意味着它不会在线程池中进行调度。 (编辑:正如在评论中指出的那样,这一个调度程序特定的决定,并不是一个硬性和快速的保证,但我希望任何明智的生产调度程序将避免在线程池上安排长时间运行的任务。

你绝对不应该在线程池上安排大量的长时间运行的任务。 我相信现在线程池的默认大小是相当大的(因为它经常被这样滥用),但是从根本上说不应该这样使用。

线程池的要点是避免创build新线程的任务比实际运行的时间短。 如果任务长时间运行,那么创build新线程的影响将相对较小 – 而且您不希望最终可能会耗尽线程池线程。 (现在不太可能,但是我在早期版本的.NET中已经体验过了。)

就个人而言,如果我有select,我肯定会使用TPL的理由是, Task API是相当不错的 – 但要记得告诉TPL,你期望任务运行很长一段时间。

编辑:正如注释中所述,另请参阅PFX团队在TPL和线程池之间进行select的博客文章:

总而言之,我将重申CLR团队的ThreadPool开发人员已经说过的内容:

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

编辑:也从评论,不要忘记,TPL允许您使用自定义调度 ,如果你真的想…