1. 程式人生 > 其它 >多執行緒之await/async

多執行緒之await/async

await/asyncC#5.0 引入的語法糖

語法糖:由編譯器提供的便捷功能,為開發帶來便捷 C#的語法糖真是非常多的 var async await

1.async 是用來修飾方法,如果單獨出現,方法會警告,沒有什麼作用

2 .await 在方法體內部,只能放在async修飾的方法內,必須放在task前面 (真的嗎?)

3 .加了await之後,await之後的內容,會等到Task全部完成之後才執行---但是執行緒沒有阻塞,回去幹自己的活兒;然後await裡面的內容由新執行緒A 完成,且後續內容也由新的執行緒B完成(A和B可以相同,也可能不同)

4. async/await方法裡面如果沒有返回值,推薦返回一個Task,或者void(推 薦用Task,而不是void,因為這樣才能await/wait)

5. 帶async+await後,返回值要多一層

Task Await可以用同步的方式寫非同步

返回值問題,耿耿於懷---其實因為看到的不是真相,實際上方法變成了 MoveNext()---所以返回值也就釋然了

1 await/async併發嗎—沒有併發(單個方法),提升效能嗎---不能,效能低於同步呼叫---用了 await,對單個方法,單次處理,是沒有效能提升的

2 意義何在? A 用同步的方式寫非同步,不會阻塞執行緒,提升使用者體驗 B 在於多請求併發處理,且資源有限的時候,能增加吞吐量(單位時間處理的請求)

Eleven的小孩3歲---正餐餵飯---需要花Eleven1個小時—就算自己吃,我也只能等著 他也在讀託班---3個老師12個孩子---負責餵飯---得4個小時---實際情況是孩子們一起開飯,先自己 吃,等著不吃了等著喂,才去喂---才花1.5小時---實際情況:一開始喂3個孩子,然後他們自己吃, 然後再去喂別的孩子,3個老師沒閒著,但是不是全程喂,需要孩子自己也能吃一會(3個執行緒推 動12個事兒同時執行,有部分事兒不需要老師一直參與,單個孩子還是1小時,但是吞吐上去了)

1 空的Async方法 2 Async/await是語法糖---生成了IAsyncStateMachine非同步狀態機 3 AsyncTaskMethodBuilder建造者去組裝的Async方法 狀態機模式:一個物件根據不同的狀態會有不同的行為(物件只有一 個,類似紅綠燈) <>t__builder.AwaitUnsafeOnCompleted(ref awaiter, ref stateMachine);----新的狀態機,狀態=0,然後交給ThreadPool去執 行新的

1 方法體進入了MoveNext,主執行緒執行 2 開啟執行緒,GetAwaiter(),未完成,重置狀態, 交給執行緒池 3 主執行緒return 4 執行緒池執行緒A獲取上下文,遞迴執行狀態機,後 續動作全部由執行緒A完成 5 多個await就是重複

1 方法體進入了MoveNext,主執行緒執行 2 開啟執行緒,GetAwaiter(),未完成,重置狀態, 交給執行緒池 3 主執行緒return 4 執行緒池執行緒A獲取上下文,遞迴執行狀態機,後 續動作全部由執行緒A完成 5 多個await就是重

ReadFile對比

Sync:同步,按順序執行 Task:當然併發---10個執行緒,速度快 Async: 可以併發,但是併發不多---只有3個執行緒 這裡的動作是讀硬碟---都是讀到當前程式裡面,會很卡---不僅 耗時而且卡 ReadAllBytesAsync這裡的執行緒呢? 對不起,這裡沒有!!!

InvokeWeb對比 Sync:序列的,耗時長 Task:併發高,速度快------10個執行緒---鐵打的10個執行緒 Async:耗時短一些,併發不夠高----少於10個執行緒,沒有影響併發, 能重用就是沒事兒了,利用率高一些 其實對電腦負荷比較小, GetResponseAsync這裡的執行緒呢? 對不起,這裡沒有!!

適合場景

跟第三方互動的(非託管資源,有async版本): 資料庫openAsync-Redis Web請求-Api 檔案讀取 一用到底,否則要等待?那還是有執行緒在空轉,沒意義,甚至容易 阻塞死鎖 Await為什麼能提升吞吐—只負責發命令—然後就忙別的去了—不需 要等待---事兒完成前就不浪費資源---完成後再來執行緒處理---這裡還 能複用

不適合場景

伺服器本地計算(CPU密集型,託管資源): 大資料加減乘除, 資料處理 沒有Async封裝API Socket IO密集型 適合用 CPU密集型 不適合 反而可能影響效能,因為有執行緒排程 但是用了沒啥事兒

await/async總結

語法糖, 同步方式寫非同步, 增加系統吞吐量, 一用到底, Web開發推薦