什么是異步
同步和異步主要用于修飾方法。當一個方法被調用時,調用者需要等待該方法執行完畢并返回才能繼續執行,我們稱這個方法是同步方法;當一個方法被調用時立即返回,并獲取一個線程執行該方法內部的業務,調用者不用等待該方法執行完畢,我們稱這個方法為異步方法。
異步的好處在于非阻塞(調用線程不會暫停執行去等待子線程完成),因此我們把一些不需要立即使用結果、較耗時的任務設為異步執行,可以提高程序的運行效率。net4.0在ThreadPool的基礎上推出了Task類,微軟極力推薦使用Task來執行異步任務,現在C#類庫中的異步方法基本都用到了Task;net5.0推出了async/await,讓異步編程更為方便。
Task介紹
Task是在ThreadPool的基礎上推出的,我們簡單了解下ThreadPool。ThreadPool中有若干數量的線程,如果有任務需要處理時,會從線程池中獲取一個空閑的線程來執行任務,任務執行完畢后線程不會銷毀,而是被線程池回收以供后續任務使用。當線程池中所有的線程都在忙碌時,又有新任務要處理時,線程池才會新建一個線程來處理該任務,如果線程數量達到設置的最大值,任務會排隊,等待其他任務釋放線程后再執行。線程池能減少線程的創建,節省開銷。
MSDN的描述
Task類的表示單個操作不會返回一個值,通常以異步方式執行。
Task對象是一種的中心思想基于任務的異步模式首次引入.NETFramework 4 中。
因為由執行工作Task對象通常以異步方式執行線程池線程上而不是以同步方式在主應用程序線程中,可以使用Status屬性,并將IsCanceled, IsCompleted,和IsFaulted屬性,以確定任務的狀態。
大多數情況下,lambda 表達式用于指定該任務所執行的工作量。
對于返回值的操作,您使用Task類。
我對于Task的理解是這樣的,Task是FrameWork4引進的新功能,他和ConCurrent命名空間一起被引進,用來替代Thread的使用。
根據我的使用,個人覺得,他確實比Thead的功能要豐富一些。
代碼實現
var taskList = new List<Task>();taskList.Add(Task.Run(() =>{todo}));taskList.Add(Task.Run(() =>{todo}));var tf = new TaskFactory();var result = new ErrorDetectResponse();await tf.ContinueWhenAll(taskList.ToArray(), t =>{todo});