c# 并行运算

2021-06-06 11:05

阅读:521

标签:hex   ack   private   处理   padding   stack   round   顺序   列排序   

 

 

使用System.Collections.Concurrent命名空间下的类型来用于并行循环体内:

说明
BlockingCollection 为实现 IProducerConsumerCollection 的线程安全集合提供阻止和限制功能。
ConcurrentBag 表示对象的线程安全的无序集合。
ConcurrentDictionary 表示可由多个线程同时访问的键值对的线程安全集合。
ConcurrentQueue 表示线程安全的先进先出 (FIFO) 集合。
ConcurrentStack 表示线程安全的后进先出 (LIFO) 集合。
OrderablePartitioner 表示将一个可排序数据源拆分成多个分区的特定方式。
Partitioner 提供针对数组、列表和可枚举项的常见分区策略。
Partitioner 表示将一个数据源拆分成多个分区的特定方式。
  1. ///
  2.         /// 并行循环操作集合类,集合内只取5个对象
  3.         ///
  4.         private void Demo7()
  5.         {
  6.             ConcurrentQueueint> data = new ConcurrentQueueint>();
  •             Parallel.For(0, Program.Data.Count, (i) =>
  •             {
  •                 if (Program.Data[i] % 2 == 0)
  •                     data.Enqueue(Program.Data[i]);//将对象加入到队列末尾
  •             });
  •             int R;
  •             while (data.TryDequeue(out R))//返回队列中开始处的对象
  •             {
  •                 Console.WriteLine(R);
  •             }
  •             Console.WriteLine("执行完成For.");
  •         }
  •         ///
  •         /// 并行循环操作集合类
  •         ///
  •         private void Demo8()
  •         {
  •             ConcurrentStackint> data = new ConcurrentStackint>();
  •             Parallel.ForEach(Program.Data, (i) =>
  •             {
  •                 if (Program.Data[i] % 2 == 0)
  •                     data.Push(Program.Data[i]);//将对象压入栈中
  •             });
  •             int R;
  •             while (data.TryPop(out R))//弹出栈顶对象
  •             {
  •                 Console.WriteLine(R);
  •             }
  •             Console.WriteLine("执行完成ForEach.");
  •         }
  • PLinq(Linq的并行计算)

        上面介绍完了For和ForEach的并行计算盛宴,微软也没忘记在Linq中加入并行计算。下面介绍Linq中的并行计算。

    4.0中在System.Linq命名空间下加入了下面几个新的类:

    说明
    ParallelEnumerable 提供一组用于查询实现 ParallelQuery{TSource} 的对象的方法。这是 Enumerable 的并行等效项。
    ParallelQuery 表示并行序列。
    ParallelQuery 表示并行序列。

     

    在ParallelEnumerable中提供的并行化的方法

     

    ParallelEnumerable 运算符 说明
    AsParallel() PLINQ 的入口点。指定如果可能,应并行化查询的其余部分。
    AsSequential() 指定查询的其余部分应像非并行 LINQ 查询一样按顺序运行。
    AsOrdered() 指定 PLINQ 应保留查询的其余部分的源序列排序,直到例如通过使用 orderby 子句更改排序为止。
    AsUnordered() 指定查询的其余部分的 PLINQ 不需要保留源序列的排序。
    WithCancellation() 指定 PLINQ 应定期监视请求取消时提供的取消标记和取消执行的状态。
    WithDegreeOfParallelism() 指定 PLINQ 应当用来并行化查询的处理器的最大数目。
    WithMergeOptions() 提供有关 PLINQ 应当如何(如果可能)将并行结果合并回到使用线程上的一个序列的提示。
    WithExecutionMode() 指定 PLINQ 应当如何并行化查询(即使默认行为是按顺序运行查询)。
    ForAll() 多线程枚举方法,与循环访问查询结果不同,它允许在不首先合并回到使用者线程的情况下并行处理结果。
    Aggregate() 重载 对于 PLINQ 唯一的重载,它启用对线程本地分区的中间聚合以及一个用于合并所有分区结果的最终聚合函数。

     

    1. ///
    2.         /// PLinq简介
    3.         ///
    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.             ConcurrentBagint> concurrentBag = new ConcurrentBagint>();
    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.         }

     

     

    c# 并行运算

    标签:hex   ack   private   处理   padding   stack   round   顺序   列排序   

    原文地址:https://www.cnblogs.com/mrray/p/10782779.html


    评论


    亲,登录后才可以留言!