等待多個非同步任務的方法

Charles_Su發表於2021-06-21

這節來解釋一下,在非同步程式設計中,等待多個Task的幾個方法。

WaitAll & WaitAny

Task.Wait(),這個是用來等待非同步任務完成的一個方法,當我們有多個非同步任務同時進行,需要等待所有非同步任務完成或者等待某個非同步任務完成的時候,就可以用WaitAll或WaitAny這兩個方法,下面先看一段程式碼:

等待多個非同步任務的方法

上圖中,我建立了兩個Task:taskF和taskS,這兩個非同步任務分別等待10秒和5秒,下方我使用了Task.WaitAll()方法來等待他們,我們通過Stopwatch的輸出可以看到,從Start到Stop一共等待了約10秒。

使用WaitAll等待非同步任務,在給它傳入的所有非同步任務完成前,它是會一直阻塞,所以上方的結果是10秒而不是5秒,下面我把WaitAll改為WaitAny,再看效果:

等待多個非同步任務的方法

此時等待時間變為了約5秒,這就是WaitAny的作用,當非同步任務中任一一個完成,即繼續往下執行。

這兩個Wait都是無返回值的,也就是不會捕獲到非同步任務的結果,如果需要捕獲非同步任務的結果,可以瞭解一下下面這兩個方法:

 

WhenAll & WhenAny

這兩個方法都有返回值,它們都返回一個Task物件,這個新的Task物件包裹著我們傳入的Task物件型別,下面看程式碼:

等待多個非同步任務的方法

還是兩個非同步方法,一個時間長,一個時間短,都是返回string,使用WhenAll,會返回一個Task<string[]>,也就是會捕獲到所有非同步任務的結果,返回陣列的資料順序跟傳入引數的順序一致,也就是說index為0的是第一個引數的非同步返回值,以此類推。

WhenAny跟它略有不同:

等待多個非同步任務的方法

它返回最早執行完畢的整個Task物件,而不單單是一個string。

這四個方法的使用還是要看具體的情景,非同步程式設計是個很好用但也很難用好的東西,需要不斷的切身體會。

 

相關文章