TaskFactory.StartNew与ThreadPool.QueueUserWorkItem

Dan*_*Tao 25 .net performance task threadpool taskfactory

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

是否TaskFactory.StartNew有更好的表现?它使用更少的内存吗?或者它主要是为了Task班级提供的附加功能?在后一种情况下,StartNew可能会有比较差的表现QueueUserWorkItem吗?

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

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

Eri*_*sch 7

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

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

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


Ric*_*ick 6

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

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

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

-Rick


ckr*_*mer 2

从表面上看,Task 类旨在与 .Net 4 中的新并行功能配合使用。看起来您也可以在启动/创建任务时直接使用Action或。Action<T>不过,这完全是 100% 的推测,基于查阅文档:)。