C# 學習async/await(個人理解)

2023-02-09 18:06:38

await : 等待的意思

async:非同步(非同步)

 

當我們方法內部   存在await的時候,就返回出去 執行下一步 ,等await後面的方法執行完畢 在執行await下面的方法

 

一、我們先看正常的同步操作:

 

 

 

二、加async await非同步操作(也就是說 在執行標記async 的方法 DoWorkAsync 方法的時候 如果 內部有await 則return出去 執行呼叫DoWorkAsync的下一步 .等待await 方法()執行完畢 ,則進入DoWorkAsync方法裡執行下一步)

注意:async await並不會新開執行緒

 

 

 

三、返回值為Task<T> 很好理解 非同步有返回值   有人說你這裡為什麼順序執行,還記得第一步說的呢 await就會return出去 我的下面是一個readline 所以會阻塞執行緒

什麼意思? 也就是說使用await 並不會一定執行非同步~ 正如我們第一點所說 await 不開啟新的執行緒

 

 

 

 

如果我們取消了await   可以看到  在我們的內部DoWorkAsync 是非同步執行,因為有返回值 所以我們的第三步輸出,第五步拿到返回值才會輸出出來

 

 

 

四、async Task 和async Void的區別?

很簡單~  Task任務嘛

如果你想獲取到DoWorkAsync的任務執行情況,那就返回Task 如果你只是想非同步執行,而不關心DoWorkAsync的任務完成情況 可以使用void  一般用於事件處理程式 儘量不要在其他方法使用(有可能存在報錯 異常)

 

 

 

第五步:總結

1.async await 並不開啟新的執行緒

2.async await並不一定是非同步執行(主執行緒阻塞,執行緒池沒有執行緒 就會同步執行,否則則非同步執行)

3.遇到await 我們就要想到return出去 往下面走  await 方法()   等待該方法的完成

在簡單點 await就是  遇到了 掛起該操作(注意掛起的不是await 而是async的方法  掛起時候釋放當前執行緒) 不往下面執行,等待 await 後面的 方法()執行完畢  在執行await下面的程式碼()

 

用途:

          以下是編寫程式碼前應考慮的兩個問題:

  1. 你的程式碼是否會「等待」某些內容,例如資料庫中的資料?

    如果答案為「是」,則你的工作是 I/O 繫結。     (則使用async await 而不是Task.run)

  2. 你的程式碼是否要執行開銷巨大的計算?

    如果答案為「是」,則你的工作是 CPU 繫結,並且你重視響應能力  請使用 async 和 await,但在另一個執行緒上使用 Task.Run 生成工作

 

所以個人理解 :當你去要做某事的時候   await就是讓你做出改變的事情,比如你最終目的是蒸米把米放入碗中   當你準備蒸米,洗米放入鍋中加工的時候  await 做出改變  這個時候你可以去洗菜 當你米蒸好了 開啟鍋蓋 放入碗中  結束 

(個人 也就是 你是單執行緒的)

 

在理解下哦   

 

同步:    蒸米(20分鐘)------洗水果(10分鐘)---洗菜(10分鐘)-----炒菜(20分鐘) -----(共計60分鐘)

非同步: 蒸米(20分鐘)----await做出改變(洗水果) --------洗菜(10分鐘)-----炒菜(20分鐘) -----(共計50分鐘)

壓縮非同步: 蒸米(20分鐘)----await做出改變(洗水果----await做出改變 洗菜)-----炒菜(20分鐘) -----(共計40分鐘)

 補充:Task.Run 不一定啟動新的執行緒 ,取決於當前執行緒池的數量 ,和任務狀態

如果一定要 啟動新的執行緒 Task.Factory.StartNew使用這個 

簡單的模型

使用 Async和 Await 的任務非同步程式設計 (TAP) 模型 (C#) | Microsoft Learn