C# 多个异步方法的异常处理
、
如果調(diào)用兩個(gè)異步方法,每個(gè)都會(huì)拋出異常,該如何處理呢 ? 在下面的示例中,第一個(gè) ThrowAfter 方法被調(diào)用,2s 后拋出異常(含消息 first)。該方法結(jié)束后,另一個(gè) ThrowAfter 方法也被調(diào)用,1s 后也拋出異常。事實(shí)并非如此,因?yàn)閷?duì)第一個(gè) ThrowAfter 方法的調(diào)用已經(jīng)拋出了異常,try 塊內(nèi)的代碼沒(méi)有繼續(xù)調(diào)用第二個(gè) ThrowAfter 方法,而是在 catch 塊內(nèi)對(duì)第一個(gè)異常進(jìn)行處理。
代碼如下:
現(xiàn)在,并行調(diào)用這兩個(gè) ThrowAfter 方法。第一個(gè) ThrowAfter 方法 2s 后拋出異常,1s 后第二個(gè) ThrowAfter 方法也拋出異常。使用 Task.WhenAll,不管任務(wù)是否拋出異常,都會(huì)等到兩個(gè)任務(wù)完成。因此,等待 2s 后, Task.WhenAll 結(jié)束,異常被 catch 語(yǔ)句捕獲到。但是,只能看見(jiàn)傳遞給 WhenAll 方法的第一個(gè)任務(wù)的異常信息,沒(méi)有顯示先拋出異常的任務(wù)(第二個(gè)任務(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)訪問(wèn)。在這里,可以使用 IsFaulted 屬性檢查任務(wù)的狀態(tài),以確認(rèn)它們是否為出錯(cuò)狀態(tài)。若出現(xiàn)異常,IsFaulted 屬性會(huì)返回true。可以使用 Task 類的 Exception.InnerException 訪問(wèn)異常信息本身。
總結(jié)
以上是生活随笔為你收集整理的C# 多个异步方法的异常处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 真不值!技术大神,却只是阿里P6...
- 下一篇: 介绍这个库:C# Blazor中显示Ma