知识问答

C#中Parallel类For、ForEach和Invoke使用介绍

C#中Parallel类For、ForEach和Invoke使用介绍

在C#中,Parallel类提供了一些工具来实现并行计算操作。本文将主要介绍Parallel类的三个方法:For、ForEach和Invoke,以及如何使用它们进行并行计算。

Parallel类的使用

使用Parallel类,首先要注意一些事项:

  • 首先,要确保并行操作是有意义的。并不是所有操作都可以并行执行,并行操作往往会涉及到线程间的同步和通信,如果没有必要,不要使用并行操作。
  • 其次,要确定并行的范围和任务。并行操作需要将任务分解成多个独立的子任务,然后并行执行这些子任务。
  • 最后,要注意并发访问共享变量的问题。当多个线程同时访问同一个共享变量时,需要使用线程同步的方式来避免竞态条件等问题。

下面具体介绍Parallel类的三个方法。

Parallel.For

Parallel.For方法可以并行地执行一个循环,循环的迭代范围是一个整数范围(从start到end-1)。该方法的签名如下:

public static ParallelLoopResult For(    int fromInclusive,    int toExclusive,    Action<int> body);

其中,参数fromInclusive和toExclusive分别指定循环迭代范围的起始值和结束值,参数body指定了循环体的内容,即每个迭代所要执行的操作。该方法返回一个ParallelLoopResult对象,可以用来查询并行计算的状态。

下面是一个简单的例子,使用Parallel.For并行计算1到100的总和:

long total = 0;Parallel.For(1, 101, i => total += i);Console.WriteLine(total);

在上面的例子中,使用Parallel.For并行计算1到100的总和,循环体是一个Lambda表达式,它接受一个整数参数i作为迭代计数器,并将i加到total变量中。最后使用Console.WriteLine打印出总和。运行该程序可以得到5050的结果。

Parallel.ForEach

Parallel.ForEach方法与Parallel.For类似,不同的是它可以并行地对一个IEnumerable集合中的元素进行遍历,而不是整数迭代计数器。该方法的签名如下:

public static ParallelLoopResult ForEach<TSource>(    IEnumerable<TSource> source,    Action<TSource> body);

其中,参数source指定了要遍历的IEnumerable集合,参数body指定了遍历的操作。该方法也返回一个ParallelLoopResult对象,可以用来查询并行计算的状态。

下面是一个简单的例子,使用Parallel.ForEach并行打印一个字符串列表中的所有元素:

List<string> list = new List<string>{"a", "b", "c", "d"};Parallel.ForEach(list, str => Console.WriteLine(str));

在上面的例子中,使用Parallel.ForEach并行打印一个字符串列表中的所有元素,循环体是一个Lambda表达式,它接受一个字符串参数str作为遍历计数器,并使用Console.WriteLine打印出该字符串。运行该程序可以得到以下结果:

abcd

Parallel.Invoke

Parallel.Invoke方法可以并行地执行一组方法,每个方法都是独立的且没有参数。该方法的签名如下:

public static void Invoke(params Action[] actions)

其中,参数actions是一个Action委托数组,指定了要执行的一组方法。

下面是一个简单的例子,使用Parallel.Invoke并行执行两个方法:

Parallel.Invoke(() => { Console.WriteLine("Task 1 started"); Thread.Sleep(2000); Console.WriteLine("Task 1 finished");},                () => { Console.WriteLine("Task 2 started"); Thread.Sleep(4000); Console.WriteLine("Task 2 finished"); });

在上面的例子中,使用Parallel.Invoke并行执行两个方法,分别是在控制台输出任务1开始、等待2秒、输出任务1结束,和输出任务2开始、等待4秒、输出任务2结束。运行该程序可以得到类似以下的结果:

Task 1 startedTask 2 startedTask 1 finishedTask 2 finished

总结

本文介绍了C#中Parallel类的三个方法:For、ForEach和Invoke,以及如何使用它们进行并行计算。使用Parallel类可以大大提高程序的并行性能,但要注意遵循并发编程的规范,避免出现竞态条件等问题。