沿用微软的写法,System.Threading.Tasks.::.Parallel类,提供对并行循环和区域的支持。 我们会用到的方法有For,ForEach,Invoke。

一、简单使用

首先我们初始化一个List用于循环,这里我们循环10次。(后面的代码都会按这个标准进行循环)

Code
  1. Program .Data = new List <int >();
  2. for (int i = 0; i < 10; i++)
  3. {
  4. Data.Add(i);
  5. }

下面我们定义4个方法,分别为for,foreach,并行For,并行ForEach。并测试他们的运行时长。

Code
  1. /// <summary>
  2. /// 是否显示执行过程
  3. /// </summary>
  4. public bool ShowProcessExecution = false ;
  5. /// <summary>
  6. /// 这是普通循环for
  7. /// </summary>
  8. private void Demo1()
  9. {
  10. List <int > data = Program .Data;
  11. DateTime dt1 = DateTime .Now;
  12. for (int i = 0; i < data.Count; i++)
  13. {
  14. Thread .Sleep(500);
  15. if (ShowProcessExecution)
  16. Console .WriteLine(data[i]);
  17. }
  18. DateTime dt2 = DateTime .Now;
  19. Console .WriteLine("普通循环For运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds);
  20. }
  21. /// <summary>
  22. /// 这是普通循环foreach
  23. /// </summary>
  24. private void Demo2()
  25. {
  26. List <int > data = Program .Data;
  27. DateTime dt1 = DateTime .Now;
  28. foreach (var i in data)
  29. {
  30. Thread .Sleep(500);
  31. if (ShowProcessExecution)
  32. Console .WriteLine(i);
  33. }
  34. DateTime dt2 = DateTime .Now;
  35. Console .WriteLine("普通循环For运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds);
  36. }
  37. /// <summary>
  38. /// 这是并行计算For
  39. /// </summary>
  40. private void Demo3()
  41. {
  42. List <int > data = Program .Data;
  43. DateTime dt1 = DateTime .Now;
  44. Parallel .For(0, data.Count, (i) =>
  45. {
  46. Thread .Sleep(500);
  47. if (ShowProcessExecution)
  48. Console .WriteLine(data[i]);
  49. });
  50. DateTime dt2 = DateTime .Now;
  51. Console .WriteLine("并行运算For运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds);
  52. }
  53. /// <summary>
  54. /// 这是并行计算ForEach
  55. /// </summary>
  56. private void Demo4()
  57. {
  58. List <int > data = Program .Data;
  59. DateTime dt1 = DateTime .Now;
  60. Parallel .ForEach(data, (i) =>
  61. {
  62. Thread .Sleep(500);
  63. if (ShowProcessExecution)
  64. Console .WriteLine(i);
  65. });
  66. DateTime dt2 = DateTime .Now;
  67. Console .WriteLine("并行运算ForEach运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds);
  68. }

下面是运行结果:

这里我们可以看出并行循环在执行效率上的优势了。

结论1:在对一个数组内的每一个项做单独处理时,完全可以选择并行循环的方式来提升执行效率。

原理1:并行计算的线程开启是缓步开启的,线程数量1,2,4,8缓步提升。(不详,PLinq最多64个线程,可能这也是64)

二、 并行循环的中断和跳出

当在进行循环时,偶尔会需要中断循环或跳出循环。下面是两种跳出循环的方法Stop和Break,LoopState是循环状态的参数。

Code
  1. /// <summary>
  2. /// 中断Stop
  3. /// </summary>
  4. private void Demo5()
  5. {
  6. List <int > data = Program .Data;
  7. Parallel .For(0, data.Count, (i, LoopState) =>
  8. {
  9. if (data[i] > 5)
  10. LoopState.Stop();
  11. Thread .Sleep(500);
  12. Console .WriteLine(data[i]);
  13. });
  14. Console .WriteLine("Stop执行结束。" );
  15. }
  16. /// <summary>
  17. /// 中断Break
  18. /// </summary>
  19. private void Demo6()
  20. {
  21. List <int > data = Program .Data;
  22. Parallel .ForEach(data, (i, LoopState) =>
  23. {
  24. if (i > 5)
  25. LoopState.Break();
  26. Thread .Sleep(500);
  27. Console .WriteLine(i);
  28. });
  29. Console .WriteLine("Break执行结束。" );
  30. }

执行结果如下:

结论2:使用Stop会立即停止循环,使用Break会执行完毕所有符合条件的项。

三、并行循环中为数组/集合添加项

上面的应用场景其实并不是非常多见,毕竟只是为了遍历一个数组内的资源,我们更多的时候是为了遍历资源,找到我们所需要的。那么请继续看。

下面是我们一般会想到的写法:

Code
  1. private void Demo7()
  2. {
  3. List <int > data = new List <int >();
  4. Parallel .For(0, Program .Data.Count, (i) =>
  5. {
  6. if (Program .Data[i] % 2 == 0)
  7. data.Add(Program .Data[i]);
  8. });
  9. Console .WriteLine("执行完成For." );
  10. }

C# 4.0 Parallel的更多相关文章

  1. ahjesus C# 4.0 Parallel 并行运算

    Parallel.For - for 循环的并行运算 Parallel.ForEach - foreach 循环的并行运算 Parallel.Invoke - 并行调用多个任务 Task - 任务,基 ...

  2. C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是TAP(Task-based Asynchronous Pattern, 基于任务的异步模式)

    学习书籍: <C#本质论> 1--C#5.0之后推荐使用TPL(Task Parallel Libray 任务并行库) 和PLINQ(Parallel LINQ, 并行Linq). 其次是 ...

  3. Parallel.Foreach

    随着多核时代的到来,并行开发越来越展示出它的强大威力! 使用并行程序,充分的利用系统资源,提高程序的性能.在.net 4.0中,微软给我们提供了一个新的命名空间:System.Threading.Ta ...

  4. .Net(C#)Parallel"循环"的解释以及与循环的比较

    Parallel 类提供对并行循环和区域的支持. 许多个人计算机和工作站都有两个或四个内核(即 CPU),使多个线程能够同时执行. 在不久的将来,计算机预期会有更多的内核. 为了利用当今和未来的硬件, ...

  5. C# 4.0 并行计算部分

    C# 4.0 并行计算部分   c#linq算法多线程list微软   目录(?)[-] C 40 并行计算部分 一简单使用 二 并行循环的中断和跳出 三并行循环中为数组集合添加项 四返回集合运算结果 ...

  6. Parallel多线程

    随着多核时代的到来,并行开发越来越展示出它的强大威力!使用并行程序,充分的利用系统资源,提高程序的性能.在.net 4.0中,微软给我们提供了一个新的命名空间:System.Threading.Tas ...

  7. C# Parallel并发执行相关问题

    1.Parallel并发执行 using System;using System.Collections.Generic;using System.Linq;using System.Text;usi ...

  8. Pig parallel reduce并行执行数

    parallel语句可以附加到Pig Latin中任一个关系操作符后面,然后它会控制reduce阶段的并行,因此只有对与可以触发reduce过程的操作符才有意义.     可以触发reduce过程的操 ...

  9. 一、并行编程 - 数据并行 System.Threading.Tasks.Parallel 类

    一.并行概念 1.并行编程 在.NET 4中的并行编程是依赖Task Parallel Library(后面简称为TPL) 实现的.在TPL中,最基本的执行单元是task(中文可以理解为"任 ...

随机推荐

  1. JavaEE(13) - JPA属性映射

    1. 映射实体的属性 #1. 使用@Transient修饰不想持久保存的Field #2. 使用@Enumerated修饰枚举类型的Field #3. 使用@Lob, @Basic修饰枚举类型的Fie ...

  2. uva 1534 - Taekwondo(dp+馋)

    题目连接:uva 1534 - Taekwondo 题目大意:有两组什么东西,题目背景有点忘记了,就是给出两组数,两组个数分别为n,m,要求找出min(n,m)对数.每一个数最多最多选一次,使得这mi ...

  3. Unity模拟龙之谷人物行走简单控制

    我个人挺喜欢龙之谷(DN)的人物控制的(不是广告哈....),就是人物太萌了一点,动作.打击感都挺好的. 今天用Unity简单模仿了一下DN的人物控制,当然,游戏里面动作非常多,我这里仅仅做了简单的w ...

  4. 五个项目管理学习笔记.沟通技巧II

    两.通信模型:沟通的双向过程 沟通模型: 编     码---------------->信息-----------------> 解码&歧义 发送者               ...

  5. Java JSON处理库Jackson

    Jackson是一款为Java平台提供的一套数据处理类库工具,Jackson的主要功能是提供JSON解析和生成.另外,Jackson还提供额外的类库以支持处理Avro, CBOR, CSV, Smil ...

  6. 开源 自由 java CMS - FreeCMS2.0 签字

    项目地址:http://www.freeteam.cn/ 会员注冊 打开浏览器,输入http://localhost:8080/register.jsp. 输入注冊信息后点击"注冊" ...

  7. awk学习总结(两) How awk works and awk CMD in a file

    测试文件names Tom Savage 100 Molly Lee 200 John Doe 300 $0 代表file的整行; $1,第一列;$2,第二列...... $ awk '/Tom/{p ...

  8. CSharp设计模式读书笔记(18):中介者模式(学习难度:★★★☆☆,使用频率:★★☆☆☆)

    中介者模式(Mediator Pattern):用一个中介对象(中介者)来封装一系列的对象交互,中介者使各对象不需要显式地相互引用,从而使其耦合松散,而且可以独立地改变它们之间的交互,中介者模式又称为 ...

  9. 九度OJ 1068 球半径和数量 (模拟)

    题目1068:球的半径和体积 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4797 解决:1696 题目描写叙述: 输入球的中心点和球上某一点的坐标,计算球的半径和体积 输入: 球的中心 ...

  10. java中IO写文件工具类

    以下是一些依据经常使用java类进行组装的对文件进行操作的类,平时,我更喜欢使用Jodd.io中提供的一些对文件的操作类,里面的方法写的简单易懂. 当中jodd中提供的JavaUtil类中提供的方法足 ...