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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > C# >内容正文

C#

C# 多个异步方法的异常处理

發(fā)布時間:2023/12/4 C# 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C# 多个异步方法的异常处理 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

如果調(diào)用兩個異步方法,每個都會拋出異常,該如何處理呢 ? 在下面的示例中,第一個 ThrowAfter 方法被調(diào)用,2s 后拋出異常(含消息 first)。該方法結(jié)束后,另一個 ThrowAfter 方法也被調(diào)用,1s 后也拋出異常。事實并非如此,因為對第一個 ThrowAfter 方法的調(diào)用已經(jīng)拋出了異常,try 塊內(nèi)的代碼沒有繼續(xù)調(diào)用第二個 ThrowAfter 方法,而是在 catch 塊內(nèi)對第一個異常進(jìn)行處理。

代碼如下:

private static async void StartTwoTasks() {try{await ThrowAfter(2000, "first");await ThrowAfter(1000, "second"); // the second call is not invoked// because the first method throws// an exception}catch (Exception ex){Console.WriteLine($"handled??{ex.Message}");} }

現(xiàn)在,并行調(diào)用這兩個 ThrowAfter 方法。第一個 ThrowAfter 方法 2s 后拋出異常,1s 后第二個 ThrowAfter 方法也拋出異常。使用 Task.WhenAll,不管任務(wù)是否拋出異常,都會等到兩個任務(wù)完成。因此,等待 2s 后, Task.WhenAll 結(jié)束,異常被 catch 語句捕獲到。但是,只能看見傳遞給 WhenAll 方法的第一個任務(wù)的異常信息,沒有顯示先拋出異常的任務(wù)(第二個任務(wù)),但該任務(wù)也在列表中:

代碼如下:

private?async?static?void?StartTwoTasksParallel() {try{Task tl = ThrowAfter(2000, "first");Task?t2?=?ThrowAfter(1000, "second");await?Task.WhenAll(tl, t2);}catch (Exception ex){// just display the exception information of the first task// that is awaited within whenAllConsole.WriteLine(S"handled?{ex.Message}");} }

有一種方式可以獲取所有任務(wù)的異常信息,就是在 try 塊外聲明任務(wù)變量 t1 和t2,使它們可以在 catch 塊內(nèi)訪問。在這里,可以使用 IsFaulted 屬性檢查任務(wù)的狀態(tài),以確認(rèn)它們是否為出錯狀態(tài)。若出現(xiàn)異常,IsFaulted 屬性會返回true。可以使用 Task 類的 Exception.InnerException 訪問異常信息本身。

總結(jié)

以上是生活随笔為你收集整理的C# 多个异步方法的异常处理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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