C#:数据并行

数据并行是指对源集合或数组中的元素同时(即并行)执行相同操作的情况。

简单的并行for循环

 Parallel.For(0, length, i =>
{
       //do something about i
});

并行foreach循环

            //  Method signature: Parallel.ForEach(IEnumerable<TSource> source, Action<TSource> body)
            Parallel.ForEach(files, currentFile =>
            {
                // The more computational work you do here, the greater 
                // the speedup compared to a sequential foreach loop.
                string filename = System.IO.Path.GetFileName(currentFile);
                System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap(currentFile);

                bitmap.RotateFlip(System.Drawing.RotateFlipType.Rotate180FlipNone);
                bitmap.Save(System.IO.Path.Combine(newDir, filename));

                // Peek behind the scenes to see how work is parallelized.
                // But be aware: Thread contention for the Console slows down parallel loops!!!
                Console.WriteLine("Processing {0} on thread {1}", filename,
                                    Thread.CurrentThread.ManagedThreadId);

            } //close lambda expression
                 ); //close method invocation

并行时的break和continue

在使用并行for的时候,普通的break和continue在这里并没有太大作用。

取而代之的是stop和break方法。

在 Action<int, ParallelLoopState>等这样的action中,使用如下的代码可以实现stop和break:

            Parallel.For(0, source.Length, (i, loopState) =>
            {
                loopState.Stop();
            } // Close lambda expression.
            ); // Close Parallel.For

            Parallel.For(0, source.Length, (i, loopState) =>
            {
                double d = Compute(source[i]);
                results.Push(d);
                if (d > .2)
                {
                    // Might be called more than once!
                    loopState.Break();
                    Console.WriteLine("Break called at iteration {0}. d = {1} ", i, d);
                    Thread.Sleep(1000);
                }
            });

使用Stop的时候,系统将通知其他的并行线程在可能的时候尽快停止(不是保证立即停止,使用 ParallelLoopState.IsStopped检查是否已经停止)。

使用Break的时候,上面的0, source.Length(0到10000)一共被分成了4段:0 2500 5000 7500,当执行了break的时候,只有当前段会停止,其他段仍然会继续执行。

比如在0-2500段执行了break,不会影响到2500-5000段。

复杂一点的并行:带有线程局部变量

public static ParallelLoopResult For<TLocal>(int fromInclusive, int toExclusive, Func<TLocal> localInit, Func<int, ParallelLoopState, TLocal, TLocal> body, Action<TLocal> localFinally);

下例中的subtotal即为线程中的局部变量:

            Parallel.For<long>(0, nums.Length, () => 0, (j, loop, subtotal) =>
            {
                subtotal += nums[j];
                return subtotal;
            },
                (x) => Interlocked.Add(ref total, x)
            );

fromInclusive: 开始索引(含)。 toExclusive: 结束索引(不含)。 localInit: 用于返回每个任务的本地数据的初始状态的函数委托。 body: 将为每个迭代调用一次的委托。 localFinally: 用于对每个任务的本地状态执行一个最终操作的委托。 类型参数: TLocal: 线程本地数据的类型。

第三个参数的类型为 Func<TResult>,其中 TResult 是将存储线程本地状态的变量的类型。 请注意,在此示例中使用了方法的泛型版本,并且类型参数为 long。类型参数告知编译器将要用于存储线程本地状态的临时变量的类型。 此示例中的 () => 0 表达式表示线程本地变量的初始值为零。如果是一个对象,是这样:() => new MyClass()。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏阿杜的世界

【译】Java 8的新特性—终极版1. 简介2. Java语言的新特性3. Java编译器的新特性4. Java官方库的新特性5. 新的Java工具6. JVM的新特性7. 结论8. 参考资料

前言: Java 8 已经发布很久了,很多报道表明Java 8 是一次重大的版本升级。在Java Code Geeks上已经有很多介绍Java 8新特性的文章,...

12240
来自专栏Code_iOS

数据结构:栈与队列

工程代码 Github: Data_Structures_C_Implemention -- Stack & Queue

14130
来自专栏个人分享

JAVA 几种引用类型学习

1、对象的强、软、弱和虚引用     在JDK 1.2以前的版本中,若一个对象不被任何变量引用,那么程序就无法再使用这个对象。也就是说,只有对象处于可触及(re...

35420
来自专栏技术点滴

Windows字符集的统一与转换

Windows字符集的统一与转换 一、字符集的历史渊源 在Windows编程时经常会遇到编码转换的问题,一直以来让刚接触的人摸不着头脑。其实只要弄清Win32程...

211100
来自专栏Create Sun

利用委托与Lambada创建和调用webapi接口

前言   现在项目中用的是webapi,其中有以下问题:       1.接口随着开发的增多逐渐增加相当庞大。     2.接口调用时不好管理。   以上是主要...

37290
来自专栏风口上的猪的文章

.NET面试题系列[7] - 委托与事件

C#中的委托可以说俯拾即是,从LINQ中的lambda表达式到(包括但不限于)winform,wpf中的各种事件都有着委托的身影。C#中如果没有了事件,那绝对是...

9520
来自专栏大内老A

通过实例模拟ASP.NET MVC的Model绑定机制:简单类型+复杂类型

总的来说,针对目标Action方法参数的Model绑定完全由组件ModelBinder来实现,在默认情况下使用的ModelBinder类型为DefaultMod...

26980
来自专栏写代码的海盗

scala与java之间的那些事

  scala与java之间的关系,我认为可以用一句话来开头:scala来源于java,但又高于java。   scala的设计者Martin Odersky就...

37450
来自专栏菩提树下的杨过

.NET3.5新特性,Lambda表达式

【原文地址】New “Orcas” Language Feature: Lambda Expressions 【原文发表日期】 Sunday, April 0...

20580
来自专栏蘑菇先生的技术笔记

探索c#之不可变数据类型

21240

扫码关注云+社区

领取腾讯云代金券