Thread與Task區別
- 任務可以返回結果,沒有直接的機制可以從線程返回結果。
- 任務通過使用取消令牌來支持取消,但是線程沒有。
- 一個任務可以同時執行多個線程,線程一次只能運行一個任務。
- 可以使用async和await關鍵字輕松實現異步。
- 新的Thread不處理線程池線程,而Task確實使用線程池線程。
- 任務是比線程更高層次的概念。
Thread是基於操作系統級別的線程,而ThreadPool和Task不會創建自己的操作系統線程,二者是由任務調度器(TaskScheduler)執行,默認的調度程序僅僅在ThreadPool上運行,與ThreadPool不同,Task可以在指定時間返回完成結果,並且還可以通過ContinueWith延續任務,以使得任務執行完畢后運行更多操作,如果已完成立即進行回調,也可以調用Wait來同步等待任務完成,如同Thread.Join一樣阻塞線程執行,直到任務完成
由於任務在ThreadPool上運行,因此創建不加任何選項的默認Task並不適用於執行長時間的操作,因為它們可能會將系統默認的線程池給填滿導致其他操作的線程阻塞,但是Task提供了LongRunning選項,設置此項后,告訴任務調度器(TaskScheduler)啟動新的線程,而不是在ThreadPool上運行
var task = Task.Factory.StartNew(() => ("Hello World"), TaskCreationOptions.LongRunning);
Console.WriteLine(task.Result);
任務和線程之間的最主要區別之一是異常的傳播。在使用線程時,如果我們在長時間運行的方法中獲得異常,則不可能在父函數中捕獲該異常,但是如果我們在使用任務,則很容易捕獲該異常。
