Task 在C#中表示一個異步操作。
作為一個方法的返回類型時通常與async同時出現;而async又與await正好是一對。
Task 實例可以用各種不同的方式創建。 最常見的方法是使用任務的 Factory 屬性檢索可用來創建用於多個用途的TaskFactory實例。 例如,要創建運行操作的 Task,可以使用工廠的StartNew方法:Task.Factory.StartNew(Action) ;.net 4.5又添加了Task.Run(Action) 想了解更多 請猛戳 這里 有更多示例代碼。
通常通過上面兩個方法實例的Task已經開始運行,但是它不一定是新起一個線程,而是去查找閑置線程並在此閑置的線程上去運行。
static async Task T2() { var t1 = T1(); var t2 = Task.Run(delegate { for (int i = 1111; i < 2000; i++) { Console.WriteLine(i); } }); await t1; await t2; } static async Task T1() { await Task.Run(delegate { for (int i = 0; i < 1000; i++) { Console.WriteLine(i); } }); }
如上代碼,當我們直接調用T2方法的時候 運行到var t1=T1();時已經將T1里面的任務加入到執行隊列中去;可能不會馬上執行,因為它還要去尋找閑置的線程。
運行到var t2=Task....(省略)時同樣只是將其中的任務加入到執行隊列中去,它們的任務可能是放在不同的線程中去運行的。然后再通過await去等待確定它們都執行完成。
都完成后再回到主線程(主線程只是指T2方法執行的線程)中來;
下面其實跟Task就沒有直接關系了
圖片中的提示可以看出,一個異步方法 在await Task 之前其實仍然是在進行同步運行的(可能不是很明顯,但是我寫過測試確實如此);只有在遇到了await Task的時候再將運行的任務異步操作。
小結
我最討厭小結、總結什么的了。