日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Task.Factory.StartNew 和 Task.Run 到底有什么区别?

發(fā)布時間:2023/12/4 编程问答 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Task.Factory.StartNew 和 Task.Run 到底有什么区别? 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

前言

Task.Factory.StartNew 和 Task.Run 都可以創(chuàng)建 Task:

Task.Factory.StartNew(()?=>?{?Console.WriteLine("Task.Factory.StartNew");?});Task.Run(()?=>?{?Console.WriteLine("Task.Run");?});

那它們之間有什么區(qū)別呢?

實現(xiàn)代碼

查看這 2 個方法的內(nèi)部實現(xiàn),其內(nèi)部實現(xiàn)邏輯其實是一樣的,只是傳的默認(rèn)參數(shù)不同:

//Task.Factory.StartNew public?Task?StartNew(Action?action) {Task??currTask?=?Task.InternalCurrent;return?Task.InternalStartNew(currTask,?action,?null,?m_defaultCancellationToken,?GetDefaultScheduler(currTask),m_defaultCreationOptions,?InternalTaskOptions.None); } //Task.Runpublic?static?Task?Run(Action?action) {return?Task.InternalStartNew(null,?action,?null,?default,?TaskScheduler.Default,TaskCreationOptions.DenyChildAttach,?InternalTaskOptions.None); }

最關(guān)鍵的參數(shù)區(qū)別是 Task.Run 傳入了 TaskCreationOptions.DenyChildAttach。

那這個參數(shù)有什么用呢?

DenyChildAttach

查看官方文檔[1]的解釋,DenyChildAttach 的作用是阻止子任務(wù)附加到其父任務(wù)

設(shè)想下從 Task 對象調(diào)用第三方庫組件的應(yīng)用。如果第三方庫組件也創(chuàng)建一個 Task 對象,并指定 TaskCreationOptions.AttachedToParent 以將其附加到父任務(wù)中,則子任務(wù)中出現(xiàn)的任何未經(jīng)處理的異常將會傳播到父任務(wù)。這可能會導(dǎo)致主應(yīng)用中出現(xiàn)意外行為。

創(chuàng)建代碼驗證一下:

Stopwatch?stopwatch1?=?new?Stopwatch(); stopwatch1.Start(); var?task1?=?Task.Factory.StartNew(()?=> {Run();Console.WriteLine("Task.Factory.StartNew"); });await?task1; stopwatch1.Stop(); Console.WriteLine(stopwatch1.ElapsedMilliseconds);Stopwatch?stopwatch2?=?new?Stopwatch(); stopwatch2.Start(); var?task2?=?Task.Run(()?=> {Run();Console.WriteLine("Task.Run"); });await?task2; stopwatch2.Stop(); Console.WriteLine(stopwatch2.ElapsedMilliseconds);

Run 方法代表執(zhí)行相同的第三方庫組件調(diào)用,內(nèi)部使用了 AttachedToParent:

private?static?void?Run() {Task.Factory.StartNew(()?=>{Thread.Sleep(1000);Console.WriteLine("Run");},?TaskCreationOptions.AttachedToParent); }

運行程序,你將會看到類似的如下輸出:

Task.Factory.StartNew Run 1080 Task.Run 1 Run

使用 Task.Factory.StartNew 必須等待 AttachedToParent 任務(wù)執(zhí)行完,而 Task.Run 不必。

結(jié)論

一般情況下,盡量使用 Task.Run,如果需要更精細(xì)地控制任務(wù)的行為,比如 TaskCreationOptions, 才使用 Task.Factory.StartNew。

想了解更多內(nèi)容,請關(guān)注我的個人公眾號”My IO“

參考資料

[1]

官方文檔: https://docs.microsoft.com/zh-cn/dotnet/standard/parallel-programming/attached-and-detached-child-tasks

總結(jié)

以上是生活随笔為你收集整理的Task.Factory.StartNew 和 Task.Run 到底有什么区别?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。