并行编程随记

.Net Framework 里引入了并行编程,并行编程本质上还是多线程,只是微软对此进行了封装和优化,使用多线程编程变得更简单,如下面一个例子:

for(var i = 0; i < 100000; i++)
{
    Console.WriteLine(string.Format("Work Item :", i));
}

如果把 100000 个工作项使用多个线程同时处理, 在以前还有点麻烦,现在就变得非常简单:

Parallel.For(0, 100000, (i) => {
    Console.WriteLine(string.Format("Work Item :", i));
});

上面的代码中, 程序会根据任务项数自动分区(分区大概的意思就是分成几个线程来同时处理)。

 

我们可以设置 ParallelOptions 对象,来设置最多分几个区, 如:

ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = 10; // 最多分十个区

Parallel.For(0, 100000, options, (i) => {
    Console.WriteLine(string.Format("Work Item :", i));
});

还可以通过 System.Collections.Concurrent.Partitioner 类来进行更细的分区设置, 如:

var parts = Partitioner.Create(0, 100000, 1000); // 1000 是指每个分区的元素数, 此行代码将指示创建 100 个分区
Parallel.For(parts, (i) => {
    Console.WriteLine(string.Format("Work Item :", i));
});

上面这些分区,叫做静态分区,就是分好区之后,每个区要处理的元素就已经全部确定好,但是有这种情况,如有些分区的任务很快就处理完了,有些分区的任务处理得
比较慢, 那么快的分区处理完分区的任务后没有办法帮助其他慢的分区处理任务,在这种情况下,又可以使用动态分区,具体实现方法可以参考微软官网的例子:https://msdn.microsoft.com/zh-cn/library/dd997416(v=vs.110).aspx

 

还有一个 System.Collections.Concurrent.OrderablePartitioner 类,用来对可排序的数据源进行分区。

 

相关参考:

Parallel Processing and Concurrency in the .NET Framework

5天玩转C#并行和多线程编程 —— 第一天 认识Parallel

posted @ 2017-08-14 10:03  匡匡  阅读(211)  评论(0编辑  收藏  举报