自從換team之後,看code的時候一直看到這個
一直不知道這是做啥用的,想說記錄一下
不過其實google就會有很多答案了,這邊只是記錄一下我覺得基本要知道的部分
首先async就是指非同步的意思,await就是等待的意思
如果有一個方法宣告時被加上了async,就表示這是一個非同步方法,而這個方法裡面會有幾個特點:
1. 方法內一定有await存在
2. 回傳的會是一個Task
3. 方法的名稱後面通常會加Async
大概到這邊還不知道在做啥,舉個例子好了
如果今天要做一個三明治,需要準備吐司和蛋,直覺上會有幾個方法如下:
1. 準備吐司:
toast prepareToast()
2. 準備蛋:
egg prepareEgg()
3. 製作三明治:
sandwich makeSandwich(egg e, toast t)
平常的話,大概就是照順序直接寫下來
不過想想我在準備toast的同時,好像也可以準備egg不是嗎
這兩個動作是沒有關聯跟衝突的對吧,所以我們可以把它改成非同步的方式進行,在前面加上async關鍵字,然後就會變成這樣:
async Task<egg> prepareEgg()
回傳值變成了Task<egg>了,這是什麼概念呢
簡單說就是把準備egg這件事情變成一個工作項目(Task),code大概會變成這樣:
egg e = await prepareEggAsync();
奇怪明明回傳的不是Task嗎,上面那個是簡化過的,也可以分解成這樣:
Task<egg> task = prepareEggAsync();
egg e = await task;
也就是說prepareEggAsync()實際上並不是產生一個egg,而是產生一個"準備egg的Task"
而這個Task才會產生egg
再來講講await又是什麼ˋ意思,這邊提一個滿不錯的設計思維
不要block,而是去wait
什麼意思呢,我們回到最一開始同步的方式,我必須先準備蛋,然後準備吐司,最後才做三明治
我在蛋完成之前,是沒辦法做後面的兩件事的,這個就是block的意思,因為整個流程被block在準備蛋這邊了
那麼非同步的情況呢?
會變成是"等待"準備蛋這件工作完成,在等待的期間我可以做其他事情,比如說準備吐司
await就是這個概念,egg e = await task;這一行就是表示egg這個變數由這個task去負責產出,後面在需要用到這個egg之前,都可以做其他的事情
當然這只是一個基本的概念
如果想了解更詳細,直接去微軟的網站看就好了:
https://docs.microsoft.com/zh-tw/dotnet/csharp/programming-guide/concepts/async/
個人會覺得用一般順序執行的思維去看這種非同步的code一開始會有點不習慣,但是稍微想一下大概就可以理解了
只要把他們都想成是一堆task就對了
這篇就這樣了~ 881~