Task.Factory.StartNew vs new Task

59

有人知道使用Task.Factory.StartNew和使用new Task然后调用任务的Start方法之间是否有任何区别吗?通过反射查看似乎没有太大差别。所以也许唯一的区别是Task.Factory.StartNew返回一个已经启动的任务。这正确吗?

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

2个回答

58
我发现thisStephen Toub写的一篇很好的文章,解释了使用new Task(...).Start()时实际上会有性能损失,因为启动方法需要使用同步来确保任务只被调度一次。
他的建议是在.NET 4.0中优先使用Task.Factory.StartNew。对于.NET 4.5来说,Task.Run是更好的选择

1
有时候(很少)你可能需要使用Task构造函数,例如:https://dev59.com/6mEi5IYBdhLWcg3wRaqf - noseratio - open to work
1
更多关于 @StephenCleary 偏爱 Task.Run 的确认请参见此处 - StuartLC
想要阅读这篇文章的人,可以点击以下链接获取更新后的链接 - https://devblogs.microsoft.com/pfxteam/task-factory-startnew-vs-new-task-start/ - Ankur-m

17

实际上,在Stephen Toub的这篇文章中,他指出Task.Run()与使用默认参数的Task.Factory.StartNew()是完全等价的:

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

在异步操作方面并不完全等同。正如Stephen Toub所解释的那样。这曾经让我困扰过。(https://dev59.com/wGAf5IYBdhLWcg3wUBX4) - Nathan Cooper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接