讀<C#併發程式設計經典例項.PDF>總結:
如果程式中存在大量的計算任務,並且這些任務能夠分割成幾個獨立的任務塊,那麼就應該使用並行程式設計。
並行程式設計可提高CPU利用率。
通常情況下,伺服器程式不適合並行程式設計。大多數伺服器本身就具有並行能力,在伺服器上進行並行程式設計,將降低本身的並行處理能力,不會有實際的好處。
並行程式設計分類:1、資料並行 2、任務並行
資料並行是指有大量的資料需要處理,並且每一塊資料的處理過程是彼此獨立的。
任務並行是需要執行大量任務,並且每個任務的執行過程是基本獨立的。
資料並行的幾種做法:
1、使用 Parallel.ForEach 方法
2、使用 PLINQ,它為LINQ 查詢提供了 AsParallel 擴充套件。
比較:跟PLINQ 相比,Parallel 對資源更加友好,Parallel 與系統中的其他程式配合得比較好 , 而PLINQ 會試圖讓所有的 CPU 來執行本程式。
Parallel 的缺點是它太明顯。很多情況下,PLINQ 的程式碼更加優美。
並行處理有一個非常重要的準則:每個任務塊要儘可能的互相獨立。 只要任務塊互相獨立,並行的效能就能做到最優。一旦在多個執行緒中共享狀態,必須以同步方式訪問程式的狀態時,程式的並行性就變差了。
任務並行中使用一個Task來表示任務。
並行任務錯誤處理:
由於操作是並行處理的,多個異常就會同時發生。系統會把這些異常封裝在 AggregateException 類中,在程式中丟擲程式碼。
AggregateException 型別有幾個實用的 Flatten 和 Handle 方法,用來簡化錯誤處理的程式碼:
try { Parallel.Invoke(() => { throw new Exception(); }, () => { throw new Exception(); }); } catch (AggregateException ex) { ex.Handle(exception => { Trace.WriteLine(exception); return true; // “已經處理” }); }