c# 並行運算

 

 

使用System.Collections.Concurrent命名空間下的類型來用於並行循環體內:數組

說明
BlockingCollection<T> 爲實現 IProducerConsumerCollection<T> 的線程安全集合提供阻止和限制功能。
ConcurrentBag<T> 表示對象的線程安全的無序集合。
ConcurrentDictionary<TKey, TValue> 表示可由多個線程同時訪問的鍵值對的線程安全集合。
ConcurrentQueue<T> 表示線程安全的先進先出 (FIFO) 集合。
ConcurrentStack<T> 表示線程安全的後進先出 (LIFO) 集合。
OrderablePartitioner<TSource> 表示將一個可排序數據源拆分紅多個分區的特定方式。
Partitioner 提供針對數組、列表和可枚舉項的常見分區策略。
Partitioner<TSource> 表示將一個數據源拆分紅多個分區的特定方式。
  1. /// <summary>
  2.         /// 並行循環操做集合類,集合內只取5個對象
  3.         /// </summary>
  4.         private void Demo7()
  5.         {
  6.             ConcurrentQueue<int> data = new ConcurrentQueue<int>();
  7.             Parallel.For(0, Program.Data.Count, (i) =>
  8.             {
  9.                 if (Program.Data[i] % 2 == 0)
  10.                     data.Enqueue(Program.Data[i]);//將對象加入到隊列末尾
  11.             });
  12.             int R;
  13.             while (data.TryDequeue(out R))//返回隊列中開始處的對象
  14.             {
  15.                 Console.WriteLine(R);
  16.             }
  17.             Console.WriteLine("執行完成For.");
  18.         }
  19.         /// <summary>
  20.         /// 並行循環操做集合類
  21.         /// </summary>
  22.         private void Demo8()
  23.         {
  24.             ConcurrentStack<int> data = new ConcurrentStack<int>();
  25.             Parallel.ForEach(Program.Data, (i) =>
  26.             {
  27.                 if (Program.Data[i] % 2 == 0)
  28.                     data.Push(Program.Data[i]);//將對象壓入棧中
  29.             });
  30.             int R;
  31.             while (data.TryPop(out R))//彈出棧頂對象
  32.             {
  33.                 Console.WriteLine(R);
  34.             }
  35.             Console.WriteLine("執行完成ForEach.");
  36.         }

PLinq(Linq的並行計算)

    上面介紹完了For和ForEach的並行計算盛宴,微軟也沒忘記在Linq中加入並行計算。下面介紹Linq中的並行計算。安全

4.0中在System.Linq命名空間下加入了下面幾個新的類:多線程

說明
ParallelEnumerable 提供一組用於查詢實現 ParallelQuery{TSource} 的對象的方法。這是 Enumerable 的並行等效項。
ParallelQuery 表示並行序列。
ParallelQuery<TSource> 表示並行序列。

 

在ParallelEnumerable中提供的並行化的方法函數

 

ParallelEnumerable 運算符 說明
AsParallel() PLINQ 的入口點。指定若是可能,應並行化查詢的其他部分。
AsSequential() 指定查詢的其他部分應像非並行 LINQ 查詢同樣按順序運行。
AsOrdered() 指定 PLINQ 應保留查詢的其他部分的源序列排序,直到例如經過使用 orderby 子句更改排序爲止。
AsUnordered() 指定查詢的其他部分的 PLINQ 不須要保留源序列的排序。
WithCancellation() 指定 PLINQ 應按期監視請求取消時提供的取消標記和取消執行的狀態。
WithDegreeOfParallelism() 指定 PLINQ 應當用來並行化查詢的處理器的最大數目。
WithMergeOptions() 提供有關 PLINQ 應當如何(若是可能)將並行結果合併回到使用線程上的一個序列的提示。
WithExecutionMode() 指定 PLINQ 應當如何並行化查詢(即便默認行爲是按順序運行查詢)。
ForAll() 多線程枚舉方法,與循環訪問查詢結果不一樣,它容許在不首先合併回到使用者線程的狀況下並行處理結果。
Aggregate() 重載 對於 PLINQ 惟一的重載,它啓用對線程本地分區的中間聚合以及一個用於合併全部分區結果的最終聚合函數。

 

  1. /// <summary>
  2.         /// PLinq簡介
  3.         /// </summary>
  4.         private void Demo11()
  5.         {
  6.             var source = Enumerable.Range(1, 10000);
  7.             //查詢結果按source中的順序排序
  8.             var evenNums = from num in source.AsParallel().AsOrdered()
  9.                        where num % 2 == 0
  10.                        select num;
  11.             //ForAll的使用
  12.             ConcurrentBag<int> concurrentBag = new ConcurrentBag<int>();
  13.             var query = from num in source.AsParallel()
  14.                         where num % 10 == 0
  15.                         select num;
  16.             query.ForAll((e) => concurrentBag.Add(e * e));
  17.         }
相關文章
相關標籤/搜索