C# 并行编程 - 简介

如果程序中有大量的计算任务,并且这些任务能分割成几个互相独立的任务块,那就应该使用并行编程。并行编程可临时提高CPU 利用率,以提高吞吐量,若客户端系统中的CPU 经常处于空闲状态,这个方法就非常有用,但通常并不适合服务器系统。大多数服
务器本身具有并行处理能力,例如ASP.NET 可并行地处理多个请求。某些情况下,在服务器系统中编写并行代码仍然有用(如果你知道并发用户数量会一直是少数)。但通常情况下,在服务器系统上进行并行编程,将降低本身的并行处理能力,并且不会有实际的好处。

并行的形式有两种: 数据并行(data parallelism)和任务并行(task parallelism)。数据并行是指有大量的数据需要处理, 并且                                     每一块数据的处理过程基本上是彼此独立的。任务并行是指需要执行大量的任务, 并且每个任务的执行过程                                     基本上是彼此独立的。任务并行可以是动态的, 如果一个任务的执行结果会产生额外的任务, 这些新增的任                                   务也可以加入任务池。

数据并行的两种做法:Parallel.ForEach, 类似于foreach循环, 应尽可能的使用这种做法; Parallel.For, 类似于for循环。

void RotateMatrices(IEnumerable<Matrix> matrices, float degrees)
{
     Parallel.ForEach(matrices, matrix => matrix.Rotate(degrees));
}

不管选用哪种方法, 在并行处理时有一个非常重要的准则: 每个任务块要尽可能的互相独立。

任务并行: 数据并行重点在处理数据, 任务并行则关注执行任务。 Parallel类的Parallel.Invoke方法可以执行"fork/join"方式的任务                     并行

void ProcessArray(double[] array)
{
Parallel.Invoke(
() => ProcessPartialArray(array, 0, array.Length / 2),
() => ProcessPartialArray(array, array.Length / 2, array.Length)
);
}
void ProcessPartialArray(double[] array, int begin, int end)
{
// CPU 密集型的操作……
}

参考书籍: C#并发编程经典实例

猜你喜欢

转载自blog.csdn.net/u010081392/article/details/88951929