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