25

显然TaskFactory.StartNew,.NET 4.0 中的方法旨在替代ThreadPool.QueueUserWorkItem无论如何,根据这篇文章)。我的问题很简单:有人知道为什么吗?

TaskFactory.StartNew有更好的表现吗?它使用更少的内存吗?还是主要是为了Task类提供的附加功能?在后一种情况下,性能StartNew可能QueueUserWorkItem?

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

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

4

3 回答 3

7

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

此外,指定您自己的 TaskScheduler 的能力意味着您可以根据需要对其进行自定义。内置的任务调度器比旧的线程池更能感知多核。

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

于 2010-06-15T17:15:01.913 回答
6

TaskFactory.StartNew 更适合高性能场景。

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

您还将获得性能优势,因为 System.Threading.Tasks 建立在线程池中的工作窃取之上,这对局部性(重要时)更好。

-瑞克

于 2010-06-22T06:50:41.713 回答
2

仅从外观上看,Task 类旨在与 .Net 4 中的新并行功能一起使用。看起来您也可以在启动/创建任务时使用Action或直接使用。Action<T>不过,这都是 100% 的猜想,基于对文档的探索:)。

于 2010-06-15T17:06:33.057 回答