簡介:任務並行庫(Task Parellel Library)是BCL的一個類庫,極大的簡化了並行編程。
使用任務並行庫執行循環
C#當中我們一般使用for和foreach執行循環,有時候我們呢的循環結構每一次的迭代需要依賴以前一次的計算或者行為。但是有時候則不需要。如果迭代之間彼此獨立,並且程序運行在多核處理器上,如果能將不同的迭代放到不同的處理器上並行處理,則會獲益匪淺。Parallel.For和Parallel.ForEach就是為此而生的。
①使用Parallel.For 聲明如下:
這里可以看到 toExclusive這個參數,它是不含的, 在使用的時候傳入參數要注意下。
舉個例子:
static void Main(string[] args) { Parallel.For(0, 5, i => { //打印平方 Console.WriteLine("The Square of {0} is {1}", i, i * i); } ); Console.ReadKey(); }
執行結果:
The Square of 0 is 0 The Square of 2 is 4 The Square of 1 is 1 The Square of 4 is 16 The Square of 3 is 9
從執行結果上我們可以看到,它不是按順序執行的。那么問題來了,怎么讓結果保持有序?
我們可以通過一個數組來存儲執行的結果,例如下面的例子:
static void Main(string[] args) { const int maxValues = 5; int[] Squares = new int[maxValues]; Parallel.For(0, maxValues , i =>Squares[i] = i*i ); for (int i = 0; i < maxValues; i++) Console.WriteLine("Square of {0} is {1}", i, Squares[i]); Console.ReadKey(); }
我們首先定義了一個數組,然后由於數組的下標已經定下來了,所以每次執行都會存入具體的位置,然后遍歷結果的數組,就得到了有順序的結果。
②使用Parallel.ForEach
最簡單的實現,聲明如下:
舉例:
static void Main(string[] args) { string[] squares = new string[] {"We", "hold", "these", "truths", "to", "be", "self-evident", "that", "all", "men", "are", "created", "equal"}; Parallel.ForEach(squares, i => Console.WriteLine(string.Format("'{0}' has {1} letters", i, i.Length))); Console.ReadKey(); }
結果:
'We' has 2 letters 'hold' has 4 letters 'these' has 5 letters 'to' has 2 letters 'truths' has 6 letters 'self-evident' has 12 letters 'that' has 4 letters 'be' has 2 letters 'men' has 3 letters 'are' has 3 letters 'created' has 7 letters 'equal' has 5 letters 'all' has 3 letters
這里同樣可以看到,不是按順序遍歷的。