C#並行編程--並行任務


並行任務的概念(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;

 





 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM