设计模式---并行循环(2-1)

  在.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方法

posted @ 2013-05-01 21:14  继续敷衍、空白的日子  阅读(1320)  评论(0编辑  收藏  举报