async和await、Task和線程池線程的關系


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

早期的線程創建是利用 Thread類,線程的創建需要花費很多時間,基於此,微軟公司為開發人員創建了線程池,線程池具有智能爬山算法,可以

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

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

 

線程的問題在於無法知道代碼是否執行完成,為此,微軟公司創建了Task,這個任務可以查詢到狀態,已完成,出錯或者准備開始,Parallel.for

和PLinq都是基於任務。

 

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

那么,當任務執行在操作系統或者遠程計算機的時候,這段時間,線程就是阻塞狀態。

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

是:當你執行一個異步任務的時候,使你的線程返回程序,這段時間任務的執行是在操作系統執行或者是在遠程計算機上,所以你的線程可以繼續

做其他的工作,將來的某個時候,線程池線程會通知Task對象,后者執行await后面的代碼,執行編譯器為你生成的代碼,查詢任務狀態。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM