显然,.NET 4.0中的TaskFactory.StartNew
方法旨在替代ThreadPool.QueueUserWorkItem
(according to this post, anyway)。我的问题很简单:有谁知道为什么?
TaskFactory.StartNew
有更好的表现吗?它使用更少的内存吗?或者它主要是由Task
类提供的附加功能?在后一种情况下,StartNew
的表现可能比<{1}} 更差吗?
在我看来,QueueUserWorkItem
实际上可能会使用更多内存而不是StartNew
,因为它会在每次调用时返回QueueUserWorkItem
个对象,我希望这导致更多的内存分配。
无论如何,我很想知道哪种更适合高性能场景。
答案 0 :(得分:7)
表现是......依赖。如果您正在执行大量并行任务,那么.net 4任务将表现更好,并为您提供更精细的控制(更强大的取消,同时等待多个任务的能力,创建父/子任务关系的能力,能力指定LongRunning等等..等等。)
此外,指定您自己的TaskScheduler的功能意味着您可以根据需要自定义它。内置的任务调度程序比旧的ThreadPool更具多核心感知能力。
至于使用更多内存。每个线程保留至少1MB的内存,用于存储任务对象的微小数量是无关紧要的。我真的认为这是你最后的担忧。
答案 1 :(得分:6)
TaskFactory.StartNew更适合高性能方案。
通过System.Threading.Tasks中的一组类以及设计中的关注+与并行循环和选项的集成,您可以获得生产力优势。
您还将获得性能优势,因为System.Threading.Tasks构建在线程池中的工作窃取之上,这对于本地化更有利(当它重要时)。
-Rick
答案 2 :(得分:2)
从外观上看,Task类设计用于.Net 4中的新并行功能。在启动/创建时,您似乎可以直接使用Action
或Action<T>
一个任务。不过,这完全是100%的猜想,基于对文档的探讨:)。