讀<C#併發編程經典實例.PDF>總結: 如果程式中存在大量的計算任務,並且這些任務能夠分割成幾個獨立的任務塊,那麼就應該使用並行編程。 並行編程可提高CPU利用率。 通常情況下,伺服器程式不適合併行編程。大多數伺服器本身就具有並行能力,在伺服器上進行並行編程,將降低本身的並行處理能力,不會有實際的 ...
讀<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; // “已經處理” }); }