2010-06-15 45 views
25

.NET 4.0中的TaskFactory.StartNew显然是用来代替ThreadPool.QueueUserWorkItemaccording to this post, anyway)。我的问题很简单:有谁知道为什么?TaskFactory.StartNew vs ThreadPool.QueueUserWorkItem

请问TaskFactory.StartNew有更好的表现吗?它使用更少的内存吗?还是主要用于Task课程提供的附加功能?在后一种情况下,StartNew是否可能有表现比QueueUserWorkItem

在我看来,这StartNew实际上会潜在地使用内存比QueueUserWorkItem,因为它返回一个Task对象与每一个电话,我可以预料,导致更多的内存分配。

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

回答

2

仅仅从外观上看,Task类被设计用于处理.Net 4中的新并行功能。它看起来也可以在开始/创建任务时直接使用ActionAction<T>。尽管如此,基于对文档的讨论,这完全是100%的猜测:)。

7

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

此外,指定您自己的TaskScheduler的能力意味着您可以自定义它以满足您的需求。内置的任务调度器比旧的ThreadPool具有更多的多核意识。

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

+0

AFAIK默认TaskScheduler使用ThreadPool,并且当您需要多核支持时,它们之间没有区别。这家伙甚至做了一些测试:http://stackoverflow.com/a/5219311/152291 – prostynick 2013-07-19 10:11:11

6

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

您可以通过System.Threading.Tasks中的一组类以及进入其设计的注意事项+并行循环和选项的集成来获得生产效益。

由于System.Threading.Tasks建立在线程池中的工作之上,对于局部性(当它很重要)更好时,您也将获得性能优势。

-Rick

+0

嗨瑞克,你可以告诉我,当我使用Task.Factory.StartNew,这是否需要线程从池中,我有在我的游泳池中减少1个线程?谢谢 – 2016-03-16 09:52:18

+1

Task.Factory.StartNew将使用.net线程池,所以是线程将来自池 – Rick 2016-03-16 16:53:09

+0

有没有什么办法可以启动不会从线程池中取出的新线程? – 2016-03-17 16:52:42

相关问题