TaskFactory.StartNew与ThreadPool.QueueUserWorkItem

时间:2010-06-15 16:50:00

标签: .net performance task threadpool taskfactory

显然,.NET 4.0中的TaskFactory.StartNew方法旨在替代ThreadPool.QueueUserWorkItemaccording to this post, anyway)。我的问题很简单:有谁知道为什么?

TaskFactory.StartNew有更好的表现吗?它使用更少的内存吗?或者它主要是由Task类提供的附加功能?在后一种情况下,StartNew的表现可能比<{1}} 更差吗?

在我看来,QueueUserWorkItem实际上可能会使用更多内存而不是StartNew,因为它会在每次调用时返回QueueUserWorkItem个对象,我希望这导致更多的内存分配。

无论如何,我很想知道哪种更适合高性能场景。

3 个答案:

答案 0 :(得分:7)

表现是......依赖。如果您正在执行大量并行任务,那么.net 4任务将表现更好,并为您提供更精细的控制(更强大的取消,同时等待多个任务的能力,创建父/子任务关系的能力,能力指定LongRunning等等..等等。)

此外,指定您自己的TaskScheduler的功能意味着您可以根据需要自定义它。内置的任务调度程序比旧的ThreadPool更具多核心感知能力。

至于使用更多内存。每个线程保留至少1MB的内存,用于存储任务对象的微小数量是无关紧要的。我真的认为这是你最后的担忧。

答案 1 :(得分:6)

TaskFactory.StartNew更适合高性能方案。

通过System.Threading.Tasks中的一组类以及设计中的关注+与并行循环和选项的集成,您可以获得生产力优势。

您还将获得性能优势,因为System.Threading.Tasks构建在线程池中的工作窃取之上,这对于本地化更有利(当它重要时)。

-Rick

答案 2 :(得分:2)

从外观上看,Task类设计用于.Net 4中的新并行功能。在启动/创建时,您似乎可以直接使用ActionAction<T>一个任务。不过,这完全是100%的猜想,基于对文档的探讨:)。