並行程式設計

_York發表於2018-06-05

讀<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; // “已經處理”
     });
 }                    

 

相關文章