DOTNETBOY

C# 并行任务之———Parallel类

Parallel用于并行编程,它是在Task的基础上做了封装,适用于.net framework 4.0及以上版本,Parallel类提供了数据和任务的并行性。

下面我们来看一下Paralle类的简单用法。


1、Parallel.For()

Paraller.For()与for循环语句类似,也是多次执行一个任务。使用Paraller.For()方法,可以并行运行迭代,迭代顺序不固定。  

1.1、在Paraller.For()最简单的用法中有三个参数,前两个参数表示开始索引与结束索引,最后一个参数是一个返回值为int的委托,表示内部执行的次数,如下:

Parallel.For(0, 10, i =>
{
Console.WriteLine($"迭代次数:{i}");
});

响应结果:


1.2、我们还可以手动终止Parallel.For()的迭代,如下:

Parallel.For(0, 10, (i, state) =>
{
if (i > 3)
state.Break();
else
Console.WriteLine($"迭代次数:{i}");
});

响应结果:



2、Parallel.Foreach()

Paraller.ForEach()方法遍历实现了IEnumerable的集合,类似于foreach语句,但以异步方式遍历,遍历顺序不固定。

2.1、在Paraller. ForEach  ()最简单的用法中有两个参数,第一个参数为需要遍历的集合,第二个参数是一个返回值为集合类型的委托,如下:  

var list = new List<String>() { "A", "B", "C", "D", "E", "F", "G" };
Parallel.ForEach<String>(list, str =>
{
Console.WriteLine(str);
});

响应结果:


 2.1、Parallel.Foreach()也可以像Parallel.For一样传入迭代次数和并行状态,并手动终止迭代:

var list = new List<String>() { "A", "B", "C", "D", "E", "F", "G" };
Parallel.ForEach<String>(list, (str, state, i) =>
{
if (i > 3)
state.Break();
else
Console.WriteLine(str + ",迭代次数:" + i);
});

响应结果:



3、Parallel.Invoke()

我们先来看一段简单的不能再简单的代码:

Stopwatch timer = Stopwatch.StartNew();
//方法一
Thread.Sleep(3000);
Console.WriteLine("测试1"); //方法二 Thread.Sleep(5000);
Console.WriteLine("测试2");
timer.Stop();
Console.WriteLine($"耗时:{timer.Elapsed.TotalSeconds}");


上面的代码模拟了两个比较耗时的方法顺序执行,可以看到耗时是两个方法消耗的时间总和。

下面我们再来看看Parallel.Invoke()并行处理的结果:

Stopwatch timer = Stopwatch.StartNew();
Parallel.Invoke(() =>
{ //方法一 Thread.Sleep(3000);
Console.WriteLine("测试1");
}, () =>
{
//方法二 Thread.Sleep(5000);
Console.WriteLine("测试2");
});
Console.WriteLine($"耗时:{timer.Elapsed.TotalSeconds}");


并行处理后,耗时缩减到了方法二,也就是耗时最多的方法执行完后成的时间。

上面也就是Parallel.Invoke()的使用方法,该方法的功能与Task有些类似,就是并发执行一系列(最好)不想关的任务,和Task比起来,省略了Task.WaitAll这一步。

最简单的用法:Parallel.Invoke( params Action[] actions)


以上就是本次Paralle类相关的所有内容了,更深层次的应用还需要大家自己去体验发掘。

分享
15 条评论
  • 小布丁

    小布丁来至 上海市 的网友

  • 小布丁

    小布丁来至 上海市 的网友

  • 小布丁

    小布丁来至 上海市 的网友

  • 小布丁

    小布丁来至 上海市 的网友

  • 小布丁

    小布丁来至 上海市 的网友

正在拼了命为您加载…