這節來解釋一下,在異步編程中,等待多個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。
這四個方法的使用還是要看具體的情景,異步編程是個很好用但也很難用好的東西,需要不斷的切身體會。