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下面的程式碼()
用途:
以下是編寫程式碼前應考慮的兩個問題:
-
你的程式碼是否會“等待”某些內容,例如資料庫中的資料?
如果答案為“是”,則你的工作是 I/O 繫結。 (則使用async await 而不是Task.run)
-
你的程式碼是否要執行開銷巨大的計算?
如果答案為“是”,則你的工作是 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