2014-02-28 35 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-任務) –