c# Thread、ThreadPool、Task的區別


Thread與ThreadPoll

前台線程:主程序必須等待線程執行完畢后才可退出程序。Thread默認為前台線程,也可以設置為后台線程

后台線程:主程序執行完畢后就退出,不管線程是否執行完畢。ThreadPool默認為后台線程

線程消耗:開啟一個新線程,線程不做任何操作,都要消耗1M左右的內存

ThreadPoll是線程池 其目的是為了減少開啟新線程消耗的資源(使用線程池中的空閑線程,不必在開啟新線程,以及統一管理線程(線程池中的線程執行完畢后,回歸到線程池里,等待新任務).

總結:ThreadPoll性能優於Thread,但是Thread和ThreadPoll對線程的控制都不是很好,例如線程等待(線程執行一段時間無響應后,直接停止線程,釋放資源 等 都沒有直接的API來控制 只能通過硬編碼來實現,同時ThreadPool使用的是線程池全局隊列,全局隊列中的線程依舊會存在競爭共享資源的情況,從而影響性能。

然后task

Task的背后的實現也是使用了線程池線程,但它的性能優於ThreadPoll,因為它使用的不是線程池的全局隊列,而是使用的本地隊列,使線程之間的資源競爭減少。同時Task提供了豐富的API來管理線程、控制。但是相對前面的兩種耗內存,Task依賴於CPU對於多核的CPU性能遠超前兩者,單核的CPU三者的性能沒什么差別。

Task不等於Thread,只是微軟默認實現ThreadPoolTaskScheduler是依賴於線程池的,因為該類的可訪問性為internal,所以我們在實際編碼中無法直接在代碼中new這么一個Scheduler出來,只能通過TaskScheduler.Default間接的來使用




免責聲明!

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



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