2014-02-28 37 views
47

有谁知道在做Task.Factory.StartNewnew Task之间是否有任何区别,然后在任务上调用Start。看反射器似乎没有太大的区别。所以也许唯一的区别是Task.Factory.StartNew返回一个已经开始的任务。它是否正确?Task.Factory.StartNew vs新任务

我知道Task.Factory.StartNewTask.Run有不同的默认选项,而Task.Run是.Net 4.5的首选选项。

回答

48

我发现this Stephen Toub的一篇很棒的文章,它解释了在使用new Task(...).Start()时实际上会有性能损失,因为start方法需要使用同步来确保任务只调度一次。

他的建议是更愿意在.net 4.0中使用Task.Factory.StartNew。对于.net 4.5 Task.Runthe better option

+1

有时(很少),你可能需要使用'Task'构造函数,例如:http://stackoverflow.com/q/21424084/1768303 – Noseratio

+1

@StephenCleary [here](http://blog.stephencleary.com/2013/08/startnew)更多地确认“Task.Run”的偏好-is-dangerous.html) – StuartLC

17

其实在the article by Stephen Toub他指定Task.Run()是完全等同于使用Task.Factory.StartNew()使用默认参数:

Task.Factory.StartNew(someAction, 
CancellationToken.None, TaskCreationOptions.DenyChildAttach, TaskScheduler.Default); 
+0

与异步不完全等同。正如Stephen Toub解释的那样。 [这已经绊倒了我之前](http://stackoverflow.com/questions/24777253/waiting-for-async-await-inside-a-任务) –