C# 多个异步方法的异常处理
、
如果調用兩個異步方法,每個都會拋出異常,該如何處理呢 ? 在下面的示例中,第一個 ThrowAfter 方法被調用,2s 后拋出異常(含消息 first)。該方法結束后,另一個 ThrowAfter 方法也被調用,1s 后也拋出異常。事實并非如此,因為對第一個 ThrowAfter 方法的調用已經拋出了異常,try 塊內的代碼沒有繼續調用第二個 ThrowAfter 方法,而是在 catch 塊內對第一個異常進行處理。
代碼如下:
現在,并行調用這兩個 ThrowAfter 方法。第一個 ThrowAfter 方法 2s 后拋出異常,1s 后第二個 ThrowAfter 方法也拋出異常。使用 Task.WhenAll,不管任務是否拋出異常,都會等到兩個任務完成。因此,等待 2s 后, Task.WhenAll 結束,異常被 catch 語句捕獲到。但是,只能看見傳遞給 WhenAll 方法的第一個任務的異常信息,沒有顯示先拋出異常的任務(第二個任務),但該任務也在列表中:
代碼如下:
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}");} }有一種方式可以獲取所有任務的異常信息,就是在 try 塊外聲明任務變量 t1 和t2,使它們可以在 catch 塊內訪問。在這里,可以使用 IsFaulted 屬性檢查任務的狀態,以確認它們是否為出錯狀態。若出現異常,IsFaulted 屬性會返回true??梢允褂?Task 類的 Exception.InnerException 訪問異常信息本身。
總結
以上是生活随笔為你收集整理的C# 多个异步方法的异常处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 真不值!技术大神,却只是阿里P6...
- 下一篇: 如何在构建docker镜像时执行Sona