• 设计模式并行循环(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方法

  • 相关阅读:
    transient关键字
    java 序列化,反序列化工具
    switch case语法
    java空map定义
    斐波那契数列的实现算法
    正则表达式
    java业务逻辑代码中需要增加一些与主流业务无关操作
    阿里巴巴开发手册对manager层的定义
    july 19
    bulletproof monk quote
  • 原文地址:https://www.cnblogs.com/jxluowei/p/3053609.html
Copyright © 2020-2023  润新知