async和await Task和執行緒池執行緒的關係

2021-08-28 07:14:09 字數 755 閱讀 9282

計算機進入多核時代,開發人員想要充分利用計算機核心,需要編寫多執行緒程式。執行緒屬於程序,理想狀態下,在4核的計算機上最好有4個執行緒。

早期的執行緒建立是利用 thread類,執行緒的建立需要花費很多時間,基於此,微軟公司為開發人員建立了執行緒池,執行緒池具有智慧型爬山演算法,可以

根據執行緒的使用情況,動態調整執行緒的增加或者減少,當執行緒使用完成後,執行緒不會銷毀,而是回到執行緒池中,當新的**需要執行緒執行的時候,

就可以利用這個已經建立好的執行緒,當乙個執行緒一段時間不使用,它便會終結自己。畢竟,執行緒也需要占用空間。

執行緒的問題在於無法知道**是否執行完成,為此,微軟公司建立了task,這個任務可以查詢到狀態,已完成,出錯或者準備開始,parallel.for

和plinq都是基於任務。

雖然task可以表示任務的狀態,但是對於非同步任務卻並不特別試用。因為非同步任務並不是在當前程式完成的,需要利用作業系統或者遠端伺服器,

那麼,當任務執行在作業系統或者遠端計算機的時候,這段時間,執行緒就是阻塞狀態。

為此,微軟公司推出了async和await,await是編譯器為你寫的**,執行**肯定需要花費時間,所以await會減慢程式的執行速度,await的作用

是:當你執行乙個非同步任務的時候,使你的執行緒返回程式,這段時間任務的執行是在作業系統執行或者是在遠端計算機上,所以你的執行緒可以繼續

做其他的工作,將來的某個時候,執行緒池執行緒會通知task物件,後者執行await後面的**,執行編譯器為你生成的**,查詢任務狀態。

好文要頂

關注我收藏該文

非同步和等待 async和await

在.net 4.5中,通過async和await兩個關鍵字,引入了一種新的基於任務的非同步程式設計模型 tap 在這種方式下,可以通過類似同步方式編寫非同步 極大簡化了非同步程式設計模型。如下式乙個簡單的例項 static async void downloadstringasync2 uri ur...

defer和async的區別

當瀏覽器碰到 script 指令碼的時候 沒有 defer 或 async,瀏覽器會立即載入並執行指定的指令碼,立即 指的是在渲染該 script 標籤之下的文件元素之前,也就是說不等待後續載入的文件元素,讀到就載入並執行。有 async,載入和渲染後續文件元素的過程將和 script.js 的載入...

defer和async的區別

當瀏覽器碰到script指令碼的時候 沒有defer或async,瀏覽器會立即載入並執行指定的指令碼,立即 指的是在渲染該script標籤之下的文件元素之前,也就是說不等待後續載入的文件元素,讀到就載入並執行。有async,載入和渲染後續文件元素的過程將和script.js的載入與執行並行進行 非同...