C#中你想象的Task,很简单?
【導讀】網上關于Task的文章如數家珍,不過有一部分并未談到一個根本的問題,所創建的Task一定在線程池上運行?如何合理的使用Task?
這里并不會去重新講解每一個APi的使用,沒有任何意義,這屬于包括我在內的各位童鞋們都必須要了解的基礎前提。這里我對其作出基本總結以及使用Task時需要注意的地方
Thread與Task區別
任務可以返回結果,沒有直接的機制可以從線程返回結果。
任務通過使用取消令牌來支持取消,但是線程沒有。
一個任務可以同時執行多個線程,線程一次只能運行一個任務。
可以使用async和await關鍵字輕松實現異步。
新的Thread不處理線程池線程,而Task確實使用線程池線程。
任務是比線程更高層次的概念。
Task
.NET框架提供Threading.Tasks類,我們可以創建任務并異步運行它們,任務是代表應該完成的某些工作的對象。該任務可以告訴我們工作是否完成,并且操作返回結果,那么任務將為我們提供結果。
深入思考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);任務和線程之間的最主要區別之一是異常的傳播。在使用線程時,如果我們在長時間運行的方法中獲得異常,則不可能在父函數中捕獲該異常,但是如果我們在使用任務,則很容易捕獲該異常。
總結
以上是生活随笔為你收集整理的C#中你想象的Task,很简单?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Docker运行SQL Server
- 下一篇: 不懂数据库索引原理?因为你心里没有一点B