並行任務的概念(from msdn)
任務並行庫 (TPL) 基於任務的概念。 術語“任務並行”是指一個或多個獨立的任務同時運行。 任務表示異步操作,在某些方面它類似於創建新線程或 ThreadPool 工作項,但抽象級別較高。 任務提供兩個主要好處:
-
系統資源的使用效率更高,可伸縮性更好。
在后台,任務排隊到 ThreadPool,ThreadPool 已使用登山等算法進行增強,這些算法能夠確定並調整到可最大化吞吐量的線程數。 這會使任務相對輕量,您可以創建很多任務以啟用細化並行。 為了補償這一點,可使用眾所周知的工作竊取算法提供負載平衡。
-
對於線程或工作項,可以使用更多的編程控件。
任務和圍繞它們生成的框架提供了一組豐富的 API,這些 API 支持等待、取消、繼續、可靠的異常處理、詳細狀態、自定義計划等功能。
出於這兩個原因,在 .NET Framework 4 中,任務是用於編寫多線程、異步和並行代碼的首選 API。
創建和運行任務的兩種方式
1.隱式創建並運行任務
Parallel.Invoke(),這個方法提供隱式創建任務並且直接運行,參數就是Action,而且可以是多個Action方法
有幾種代碼可以實現
1. Parallel.Invoke(() => { Console.WriteLine("test"); }); 2. Parallel.Invoke(Sum1, Sum2); 3. Parallel.Invoke(()=> Sum1()); //Sum1是方法名稱
2.顯式創建和運行任務
1.創建任務和運行任務分開執行的方式。先創建Task,然后調用Start開始 Task t = new Task(Sum1); t.Start(); 2,創建任務和運行任務一起執行的方式。 Task.Factory.StartNew(Action action )
顯式和隱式創建任務不僅僅是代碼方式的不同,
最大的不同在於Paralle.Invoke執行並行方法以后是要等待方法執行完畢的並返回的
Task創建的任務是異步執行,不等待任務執行完畢的。所以Parallel.Invoke相當於Task開始執行以后調用Task.Wait()這個方法。
比如
//Sum1執行一段耗時方法,然后輸出結果 Parallel.Invoke(Sum1)
Console.WriteLine(".......................");
這個方法會先輸出Sum1的結果,然后才輸出“。。。。。。。。。。。”
Task t = new Task(Sum1); t.Start(); Console.WriteLine("......................."); 這個方法會先輸出".............." 然后才輸出Sum1的結果
在任務中返回結果
在Task中返回結果比較簡單
使用Task<Result> 就可以返回結果
Task<int> task1 = Task<int>.Factory.StartNew(() => 1);
int i = task1.Result;
Task<Test> task2 = Task<Test>.Factory.StartNew(() => { string s = ".NET"; double d = 4.0; return new Test { Name = s, Number = d }; }); Test test = task2.Result;
