close

自從換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~

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 頁頁頁六滴 的頭像
    頁頁頁六滴

    人森很精彩,所以要把所有事情都記起來=ˇ=

    頁頁頁六滴 發表在 痞客邦 留言(0) 人氣()