前言
在上回 Post not found: 使用Task撰寫第一個非同步程式-C-SyncAndAsync [Day4]使用Task撰寫第一個非同步程式 - C# SyncAndAsync ,我們使用了Task來撰寫第一隻非同步的程式。
而在這回將會著重在等待方面。
Task提供以下語法能夠等待:Wait、WaitAll、WaitAny、WaitAsync、WhenAll、WhenAny。
- Task.Wait:等候 Task 完成執行。
- Task.WaitAll:等待所有提供的 Task 物件完成執行。
- Task.WaitAny:等候任一提供的 Task 物件完成執行。
- Task.WaitAsync:取得 Task 當此 Task 完成或指定的超時時間過期時將完成的。(ps.是.NET6, 7 Preview 1才支援的新語法,目前是用.net core 3.1所以先不做範例)
- Task.WhenAll:建立當所有提供的工作完成時才會完成的工作。
- Task.WhenAny:建立當任何一個提供的工作完成時才會完成的工作。
這麼看來,使用Wait、When差別好像很難分清楚?再稍微比較一下:
Task.WhenAll | Task.WaitAll | |
調用時阻塞該線程 | 不會 | 會 |
返回值 | Task | 無 |
備註 | 可以用返回的Task去檢查是否完成 |
此外,Task.WhenAll()也能用前面加await的語法去製造出阻塞。
1 | await Task.WhenAll() |
因此在使用上,能夠全部使用When再搭配await去組合出Wait的效果。
實作測試
1 | using System; |
執行完結果:
1 | TaskWaitTest : 一共花費:5.0991762秒 |
可以見到When不會阻塞所以直接被帶過,而Wait造成阻塞。
總結
可以知道Task使用Wait會阻塞,When不會阻塞。
而使用When可以再之後去檢查該返回值是否完成。
至於如果想讓When阻塞,就使用await即可。
所以總結是:When搭await可以組出所有阻塞/非阻塞,因此一路組合技用到底即可,而Wait可以擺一邊放置了。