並行任務的概念(from msdn)
工作平行程式庫 (TPL) 基於任務的概念。 術語“任務並行”是指一個或多個獨立的任務同時運行。 任務表示非同步作業,在某些方面它類似於建立新線程或 ThreadPool 工作項目,但抽象層級較高。 任務提供兩個主要好處:
系統資源的使用效率更高,延展性更好。
在後台,任務排隊到 ThreadPool,ThreadPool 已使用登山等演算法進行增強,這些演算法能夠確定並調整到可最大化輸送量的線程數。 這會使任務相對輕量,您可以建立很多任務以啟用細化並行。 為了補償這一點,可使用眾所周知的工作竊取演算法提供Server Load Balancer。
對於線程或工作項目,可以使用更多的編程式控制件。
任務和圍繞它們產生的架構提供了一組豐富的 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;