等待多個異步任務的方法


這節來解釋一下,在異步編程中,等待多個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。

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM