Async Await 筆記
一個有標示 Async 的方法,.Net規定可以回傳的類別必需是
- void:使用的人其實不知道裡面有呼叫await,因此程式的流程會呼到方法裡面後,一直到await的地方後。這個方法對呼叫者來說就結束了,呼叫者會繼續執行後面的流程。至於在方法中await後面的code,會再呼叫者的緒有空時,再繼續執行。
- 由於是void,外面的人也無從得知裡面是否await,所以外面就想成是一個方法,這個方法執行到某個地方就會丟一個Task出去,應該方法可能很快就結束,等到Task結束,可能這個方法又會跑起來做完後面的事。
- Task:當方法沒有任何回傳值,可是希望裡面的code跑到await時,外面也可以一起await,不要繼續往下等,就可以用Task做為回傳值。值得注意的事,就算在程式中沒有寫任何的return,也可以直接在方法的回傳值那邊加上Task。如下所示是合理的
async Task fnNoReturn()
{
await Task.Delay(1000);
}
- Task:相較於回傳Task,沒有任何return值。若是真的有return,就可以用Task來代表回傳值,這樣外面可以等,也可以取值。
結論
方法有標示Async,就怎麼樣也讓它回傳Task,這樣外面才有機會等。除非是UI的EventHandler