parallel概念
①Parallel类提供数据和任务的并行性;
②Paraller.For()方法 类似于C#的for循环语句,也是多次执行一个任务。
使用Paraller.For()可以并行运行迭代,但迭代的顺序是打乱的。
Paraller.For(int,int,Action<int>);
参数1为循环的开头,参数2为循环的结束;参数三是个委托,整数参数是循环的迭代次数,该参数被传递给委托引用的方法。返回类型是ParallelLoopResult结构,它提供了循环是否结束的信息和最低迭代的索引;
示例
//i=0-9
ParallelLoopResult result = Parallel.For(0, 10, i =>
{
Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i,
Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);//延时
});
Console.WriteLine("是否完成:{0}", result.IsCompleted);
Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
③Parallel.ForEach()
Paraller.ForEach()遍历实现了IEnumerable的集合,其方法类似于 foreach的语句,但以异步方式遍历,这里也没有确定遍历顺序。
先描述它的第一个方法,Paraller.ForEach<TSource>(IEnumerable<TSource>,Action<TSource>);
string[] data = { "str1", "str2", "str3" };
ParallelLoopResult result = Parallel.ForEach<string>(data, str =>
{
Console.WriteLine(str);
});
Console.WriteLine("是否完成:{0}", result.IsCompleted);
Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
string[] data = { "str1", "str2", "str3", "str4", "str5" };
ParallelLoopResult result = Parallel.ForEach<string>(data, (str, state, i) =>
{
Console.WriteLine("迭代次数:{0},{1}", i, str);
if (i > 3)
state.Break();
});
Console.WriteLine("是否完成:{0}", result.IsCompleted);
Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
④Parallel.Invoke()
Parallel.Invoke()提供了任务并行性模式。
Paraller.Invoke()方法允许传递一个Action委托数组,在其中可以指定应运行的方法,允许同时调用不同的方法
Parallel.Invoke(() =>
{
Thread.Sleep(100);
Console.WriteLine("method1");
}, () =>
{
Thread.Sleep(10);
Console.WriteLine("method2");
});
Parallel.For、Parallel.ForEach函数的控制
①ParallelLoopState对象被用来控制Parallel.For函数的执行,ParallelLoopState对象是程序运行时在后台创建的;
Parallel.For(1, 100, (i, ParallelLoopState) =>{...});
②ParallelLoopState对象有两个函数Stop、Break
Stop:表示Parallel.For的执行立刻停止,无论其他执行单元是否达到停止的条件;
Break:表示满足条件的当前执行单元立刻停止,其他未满足停止条件的则会继续执行下去;
【注】:break类似于for的continue, 而stop就类似于for的break。
Parallel.For(1, 100, (i, ParallelLoopState) =>
{
// 当某一个循环单元的数大于30,
// 则跳出当前执行单元,等待其他执行单元结束
// 所有执行单元结束后退出Parallel.For的执行
if (i > 30)
{
// 跳出当前执行单元
ParallelLoopState.Break();
return;//不加return,可能会发生该进程资源未释放。
}
});
Parallel.For(1, 100, (i, ParallelLoopState) =>
{
// 当某一个循环单元的数大于30,
// 则停止Parallel.For的执行
if ( i > 30)
{
// 停止并退出Parallel.For
ParallelLoopState.Stop();
return;
}
});
ParallelLoopResult result = Parallel.For(0, 10, (i, state) =>
{
Console.WriteLine("迭代次数:{0},任务ID:{1},线程ID:{2}", i,
Task.CurrentId, Thread.CurrentThread.ManagedThreadId);
Thread.Sleep(10);
if (i > 5)
state.Break();
});
Console.WriteLine("是否完成:{0}", result.IsCompleted);
Console.WriteLine("最低迭代:{0}", result.LowestBreakIteration);
【注】:Parallel.ForEach函数一样用法;
参考文章
1. https://www.cnblogs.com/WMTcore/p/3913066.html
2.https://www.cnblogs.com/ricky-wang/p/7003162.html