[.NET]Thread vs ThreadPool vs Task

Thread vs ThreadPool vs Task

最近在網路上看到一篇介紹Thread vs ThreadPool vs Task的差別,覺得那邊寫得很好,拿來參考筆記一下。

Thread

Thread類別產生的是一個OS-level thread擁有自己的堆疊和內容,擁有比較高的控制權,可對執行緒停止、暫止、恢復執行等等......。   可指定為前台執行緒或是背景執行緒。   還可指定堆疊大小,各執行緒的文化特性。問題在於Thread類別產生的執行緒,是屬於OS層級,所以成本消耗比較大。

 

ThreadPool

.NET執行緒池,是指由CLR管理的執行緒池,當一個執行緒被使用完畢後並不會立刻銷毀,所以在執行緒池當中會存在一些沒有被銷毀的執行緒,而當應用程式需要一個新的執行緒時,就可以從執行緒池中直接獲取一個已經存在的執行緒。

.NET執行緒池你可以控制執行緒池的大小,但是沒辦法控制執行緒池何時開始執行工作。  並且執行緒池所有執行緒,都是屬於背景執行緒。

 

Task

執行緒池的使用還是有些許缺點,例如並不知道操作什麼時候會結束,無法有回傳值。所以 .NET Framework 提供了一個 Task的概念,Task可以知道工作什麼時候結束,而且結束的時候可以回傳一個Result。  Task雖然是一個非同步的概念,但是依然可以使用wait()的方法,讓程式停在Wait的地方同步執行。   當Tasks執行在ThreadPool時,如果執行的時間太長,且工作量又很多,也會導致執行緒池滿載(基本上不太可能),因此Task有提供 LongRunning option,讓TaskScheduler知道這是一件很長的工作,所以會建立一個新的執行緒,而不會從執行緒池中取得執行緒。

 

小結:

Task幾乎是非同步執行的最好選擇,提供了很多強而有力的API,且可避免OS-level Thread的成本消耗。

 

參考來源:

http://blog.slaks.net/2013-10-11/threads-vs-tasks/

 

 

一天一分享,身體好健康。

該追究的不是過去的原因,而是現在的目的。