標籤:style blog class code tar color
本篇內容主要包括:
1.能夠轉化為並行迴圈的條件
2.並行For迴圈的用法:Parallel.For
3.並行ForEach的用法Parallel.ForEach
4.並行LINQ(PLINQ)的用法AsParallel()
5.並行中斷與並行停止的用法與區別
6.外部控制迴圈取消的方法(Break,Stop)
7.處理迴圈體中拋出的異常
8.小迴圈體的分區並行方法:Parallel.ForEach
9.最大並行度的控制,Parallel.For,Parallel.ForEach
10.在迴圈體中使用局部任務狀態(個人理解就是迴圈體中包含幾個階段,但是這個階段又要求能安全執行緒的調用這些方法)
11.嘗試給並行迴圈定義自己的任務發送器。
12.注意事項。
-------------------華麗的分割線-----------------------------------------
1.能夠轉化為並行迴圈的條件
.Net Framework 4.0,VisualStudio2010,XP sp3,Vista SP1,Win7,Win8,Win2008...
對集合中的元素的操作是相同的並且互不影響,不互相影響是指執行的先後順序不影響最後結果。
生活中的情境舉例:
a:把銀行的多個服務視窗看成是多個處理器核心,不同的客戶取款操作是相互不影響的。當客戶總量一定時,多個視窗同時開放要比只開放一個視窗效率要高很多。
b:考試之後,老師判卷子,參加判卷子的老師越多,處理完所有卷子時間越短
c:程式中處理/初始化一個高數量級的對象數組,對象之間相互獨立
2.並行For迴圈的用法:Parallel.For
public int NumberOfSteps = 10000000;double[] result = new double[NumberOfSteps]; for (int i = 0; i < NumberOfSteps; i++) { result[i] = DoWork(i); }一般的順序執行的For
public int NumberOfSteps = 10000000; double[] result = new double[NumberOfSteps]; Parallel.For(0, NumberOfSteps, (i) => { result[i] = DoWork(i); });並行的For
例子中的方法原型為:public static ParallelLoopResult For(int fromInclusive, int toExclusive, Action<int> body);
傳回值為ParallelLoopResult,指示結果的狀態,定義如下
public struct ParallelLoopResult { public bool IsCompleted { get; } public long? LowestBreakIteration { get; } } ParallelLoopResult
Parallel.For 共有12種重載類型,上面是最簡單的一種,其它類型的重載可以用來指定一些並行啟動並執行配置,比如並行度,取消標幟等。
3.並行ForEach的用法Parallel.ForEach
未完待續...