Thread與Task區別
阿新 • • 發佈:2020-07-20
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);
任務和執行緒之間的最主要區別之一是異常的傳播。在使用執行緒時,如果我們在長時間執行的方法中獲得異常,則不可能在父函式中捕獲該異常,但是如果我們在使用任務,則很容易捕獲該異常。