zoukankan      html  css  js  c++  java
  • 设计模式并行循环(21)

      在.NET体系当中并行循环包含For循环和Foreach循环,并且在LQIN查询语句当中也有效。所以可以用Parellel.For方法遍历整数索引范围,也可以Parellel.Foreach。

      在C#当中顺序for循环一般

    int n=......;
    for(int i=0;i<n;i++)
    {
     //................
    }

    为了利用多核可以通过调用Parellel.For替换for将循环体转换成一个lambda表达式

    int n=........;
    Parellel.For(0,n,i=>{
         //...........
    })
    Parellel.For是一个重载的静态方法(据说有近300种重载方法)

      以下是个例子就用到Parellel.For的方法声明。

    Parallel.For(int fromInclusive,
         int toexclusive, 
        Action<int> body)

         在前2个参数指定迭代的限制第一个参数是最低索引(最小值),第二个就是上限(最大值),第三个参数是每次迭代都要调用一次的操作,这个操作迭代索引作为它的参数,对于每个索引,循环体运行一次。第三个参数也可以是委托、匿名方法或普通命名方法。

    2、并行ForEach循环

     也先看下C#当中顺序foreach的写法

        IEnumerable<MyObject> myEnumerable=...;
    foreach(var obj in myEnumerable)
    {
       //...........
    
    }

    要利用多核技术就要用Parallel.ForEach方法替换顺序foreach

    IEnumerable<myobj> myeum=..........;
    Parallel.ForEach(myeum,obj=>{
     //........
    });

    这个循环是不保证顺序的执行

    3.并行LINQ

    linq中包含一个Plinq(PLINQ就是并行编程模式)

    IEnumerable<myobj> soure=..............;
    //LINQ
    var query1=from i in soure select Normalize(i);
    //PLINQ
    var query2=form i in soure.AsParallel();
    select Nomalize(i);

    上面创建2个枚举对象如果有多核的情况下PLINQ版本就会使用多核。

    在遍历所有输入值而不需要返回输入值的情况时也可以用PLINQ的ForAll

    IEnumerable<myobj> myenum=........;
    myrnum.AsParallel().ForAll(obj=>DoWork(obj));

    这里的ForAll的扩展方法等同Plinq里面的parallel.ForEach方法

  • 相关阅读:
    beta冲刺—— Day 4
    beta冲刺—— Day 3
    beta冲刺—— Day 2
    刚下飞机——Beta阶段随笔集合
    刚下飞机——Alpha冲刺
    刚下飞机——Beta答辩博客
    刚下飞机——用户使用调查报告
    刚下飞机——Beta冲刺总结博客
    Beta冲刺(7/7)
    Beta冲刺(6/7)
  • 原文地址:https://www.cnblogs.com/jxluowei/p/3053609.html
Copyright © 2011-2022 走看看