最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C#中Task.Wait()、Task.Result、Task.GetAwaiter().GetResult()區(qū)別

 更新時(shí)間:2025年12月28日 11:15:10   作者:無風(fēng)聽海  
本文主要介紹了C#中Task.Wait()、Task.Result、Task.GetAwaiter().GetResult()區(qū)別,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

一、概念對比

方法/屬性阻塞線程調(diào)用 TaskAwaiter continuation異常處理典型用途
Task.Wait()? 阻塞調(diào)用線程? 不觸發(fā) continuation拋 AggregateException同步等待 Task 完成,不關(guān)心結(jié)果
Task.Result? 阻塞調(diào)用線程? 不觸發(fā) continuation拋 AggregateException 包含 Task 異常同步獲取 Task 結(jié)果
Task.GetAwaiter().GetResult()? 阻塞調(diào)用線程? 不觸發(fā) continuation直接拋原始異常(不包 AggregateException)內(nèi)部 await/框架調(diào)用同步獲取 Task 結(jié)果,更精確異常

二、底層機(jī)制分析

1、 Task.Wait()

public void Wait() {
    if (!IsCompleted)
        WaitHelper.Wait(this, Timeout.Infinite, cancellationToken: default);
}
  • 使用 WaitHelper.Wait(),內(nèi)部通過 ManualResetEventSlimWaitHandle 阻塞調(diào)用線程。
  • 阻塞當(dāng)前線程,等待 Task 完成(RunToCompletion/Faulted/Canceled)。
  • 不觸發(fā) TaskAwaiter 的 continuation。

2、Task.Result

public T Result {
    get {
        Wait();           // 調(diào)用同步等待
        return GetResult(); // 返回 Task<T> 結(jié)果
    }
}
  • 內(nèi)部先阻塞等待 Task 完成(調(diào)用 Wait())。

  • 然后返回 Task 結(jié)果或拋異常。

  • 對異常處理不同:

    • Wait()Result 會把 Task 異常 封裝為 AggregateException。

3、 Task.GetAwaiter().GetResult()

var awaiter = task.GetAwaiter();
awaiter.GetResult();
  • 不阻塞 Task 的內(nèi)部狀態(tài)管理,直接使用 TaskAwaiter 的 GetResult()

    • 如果 Task 未完成 → 會阻塞調(diào)用線程等待完成
    • 如果 Task 完成 → 直接返回結(jié)果或拋異常
  • Task.Result 最大區(qū)別:

    • 異常不會包裝成 AggregateException,而是拋原始異常
  • 不觸發(fā) async continuation

三、線程行為對比

Caller Thread
 ├─ Task.Wait() / Task.Result / GetAwaiter().GetResult()
 |    -> 阻塞當(dāng)前線程
Task completes (ThreadPool/IOCP)
 ├─ Task signals wait handle
Caller Thread unblocks
 ├─ Wait() 返回 / Result 返回 / GetResult() 返回或拋異常

注意:無論哪種方式,continuation 不會在阻塞線程上執(zhí)行。

  • async/await 的 continuation 依賴 OnCompleted / SynchronizationContext 調(diào)度
  • 直接同步阻塞方法繞過了這些機(jī)制

四、異常處理差異

方法異常類型包裝情況
Task.Wait()Task 異常AggregateException
Task.ResultTask 異常AggregateException
Task.GetAwaiter().GetResult()Task 異常原始異常(unwrap)

?? 這是為什么 GetAwaiter().GetResult() 更常在庫內(nèi)部使用,因?yàn)樗梢员苊忸~外的 AggregateException 包裝,保持異常原樣。

五、潛在風(fēng)險(xiǎn)

  1. 死鎖

    • 在 UI 線程調(diào)用 Wait() / Result,而 Task continuation 捕獲 SynchronizationContext → continuation 無法執(zhí)行 → 死鎖。
  2. 線程阻塞

    • 阻塞調(diào)用線程,浪費(fèi)資源,ThreadPool 擴(kuò)展可能觸發(fā)饑餓。

六、總結(jié)

  1. Task.Wait() → 阻塞等待,無返回值,異常 AggregateException
  2. Task.Result → 阻塞等待,返回結(jié)果,異常 AggregateException
  3. Task.GetAwaiter().GetResult() → 阻塞等待,返回結(jié)果或拋原始異常,內(nèi)部 await/框架常用
  4. 都不觸發(fā) continuation,阻塞線程可能導(dǎo)致死鎖
  5. async/await 才是非阻塞、自動調(diào)度 continuation 的機(jī)制

到此這篇關(guān)于C#中Task.Wait()、Task.Result、Task.GetAwaiter().GetResult()區(qū)別的文章就介紹到這了,更多相關(guān)Task.Wait()、Task.Result、Task.GetAwaiter().GetResult()內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • C# Winform 禁止用戶調(diào)整ListView的列寬

    C# Winform 禁止用戶調(diào)整ListView的列寬

    在使用 ListView 的時(shí)候, 有時(shí)我們不想讓別人隨意調(diào)整列寬, 或者某幾列的列寬, 以便達(dá)到美觀, 或者隱藏?cái)?shù)據(jù)的作用. 那么可以用一下代碼來實(shí)現(xiàn)
    2011-05-05
  • C#實(shí)現(xiàn)過濾html標(biāo)簽并保留a標(biāo)簽的方法

    C#實(shí)現(xiàn)過濾html標(biāo)簽并保留a標(biāo)簽的方法

    這篇文章主要介紹了C#實(shí)現(xiàn)過濾html標(biāo)簽并保留a標(biāo)簽的方法,文中的自定義函數(shù)采用正則過濾實(shí)現(xiàn)了該功能,是非常實(shí)用的技巧,需要的朋友可以參考下
    2014-09-09
  • 英雄聯(lián)盟輔助lol掛機(jī)不被踢的方法(lol掛機(jī)腳本)

    英雄聯(lián)盟輔助lol掛機(jī)不被踢的方法(lol掛機(jī)腳本)

    lol掛機(jī)不會被踢,調(diào)用API設(shè)置鼠標(biāo)位置并模擬鼠標(biāo)右鍵讓人物走動
    2013-12-12
  • C#的并發(fā)機(jī)制優(yōu)秀在哪你知道么

    C#的并發(fā)機(jī)制優(yōu)秀在哪你知道么

    這篇文章主要為大家詳細(xì)介紹了C#的并發(fā)機(jī)制,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • C# winform實(shí)現(xiàn)登陸次數(shù)限制

    C# winform實(shí)現(xiàn)登陸次數(shù)限制

    這篇文章主要介紹了C# winform實(shí)現(xiàn)登陸次數(shù)限制,相信大家都遇到過網(wǎng)站在用戶多次輸錯(cuò)密碼之后會自動把賬戶凍結(jié)的情況,這種功能如何實(shí)現(xiàn),下面小編為大家分享實(shí)現(xiàn)方法
    2016-05-05
  • C#用ComboBox控件實(shí)現(xiàn)省與市的聯(lián)動效果的方法

    C#用ComboBox控件實(shí)現(xiàn)省與市的聯(lián)動效果的方法

    這篇文章主要介紹了C#用ComboBox控件實(shí)現(xiàn)省與市的聯(lián)動效果的方法,較為詳細(xì)的分析了ComboBox控件的使用原理與相關(guān)技巧,需要的朋友可以參考下
    2015-01-01
  • 在WPF中使用Interaction.Triggers

    在WPF中使用Interaction.Triggers

    這篇文章介紹了在WPF中使用Interaction.Triggers的方法,文中通過示例代碼介紹的非常詳細(xì)。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-06-06
  • C# SQlite操作方法小結(jié)

    C# SQlite操作方法小結(jié)

    這篇文章主要介紹了C# SQlite操作方法,較為詳細(xì)的講述了SQLite的下載與C#針對SQLite的連接、創(chuàng)建、與執(zhí)行SQL語句等操作相關(guān)技巧,需要的朋友可以參考下
    2016-07-07
  • 手動編譯C#代碼的方法

    手動編譯C#代碼的方法

    在本文里小編給大家分享的是關(guān)于手動編譯C#代碼的方法和步驟,對此有需要的朋友們可以學(xué)習(xí)下。
    2018-12-12
  • C#實(shí)現(xiàn)分治算法求解股票問題

    C#實(shí)現(xiàn)分治算法求解股票問題

    本文主要介紹了C#實(shí)現(xiàn)分治算法求解股票問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論

尼玛县| 朔州市| 家居| 嘉鱼县| 宾川县| 宁远县| 连江县| 铜梁县| 无极县| 内乡县| 英德市| 荥经县| 义乌市| 虹口区| 佳木斯市| 金山区| 克什克腾旗| 娄烦县| 宁安市| 绥中县| 宜兰市| 梁平县| 澄迈县| 澎湖县| 成安县| 雅江县| 垦利县| 固阳县| 贵港市| 娄底市| 博乐市| 陈巴尔虎旗| 闻喜县| 贞丰县| 伊金霍洛旗| 麟游县| 沭阳县| 东方市| 双城市| 仙桃市| 乌恰县|