C# 4.0 Parallel
沿用微软的写法,System.Threading.Tasks.::.Parallel类,提供对并行循环和区域的支持。 我们会用到的方法有For,ForEach,Invoke。
一、简单使用
首先我们初始化一个List用于循环,这里我们循环10次。(后面的代码都会按这个标准进行循环)
- Program .Data = new List <int >();
- for (int i = 0; i < 10; i++)
- {
- Data.Add(i);
- }
下面我们定义4个方法,分别为for,foreach,并行For,并行ForEach。并测试他们的运行时长。
- /// <summary>
- /// 是否显示执行过程
- /// </summary>
- public bool ShowProcessExecution = false ;
- /// <summary>
- /// 这是普通循环for
- /// </summary>
- private void Demo1()
- {
- List <int > data = Program .Data;
- DateTime dt1 = DateTime .Now;
- for (int i = 0; i < data.Count; i++)
- {
- Thread .Sleep(500);
- if (ShowProcessExecution)
- Console .WriteLine(data[i]);
- }
- DateTime dt2 = DateTime .Now;
- Console .WriteLine("普通循环For运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds);
- }
- /// <summary>
- /// 这是普通循环foreach
- /// </summary>
- private void Demo2()
- {
- List <int > data = Program .Data;
- DateTime dt1 = DateTime .Now;
- foreach (var i in data)
- {
- Thread .Sleep(500);
- if (ShowProcessExecution)
- Console .WriteLine(i);
- }
- DateTime dt2 = DateTime .Now;
- Console .WriteLine("普通循环For运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds);
- }
- /// <summary>
- /// 这是并行计算For
- /// </summary>
- private void Demo3()
- {
- List <int > data = Program .Data;
- DateTime dt1 = DateTime .Now;
- Parallel .For(0, data.Count, (i) =>
- {
- Thread .Sleep(500);
- if (ShowProcessExecution)
- Console .WriteLine(data[i]);
- });
- DateTime dt2 = DateTime .Now;
- Console .WriteLine("并行运算For运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds);
- }
- /// <summary>
- /// 这是并行计算ForEach
- /// </summary>
- private void Demo4()
- {
- List <int > data = Program .Data;
- DateTime dt1 = DateTime .Now;
- Parallel .ForEach(data, (i) =>
- {
- Thread .Sleep(500);
- if (ShowProcessExecution)
- Console .WriteLine(i);
- });
- DateTime dt2 = DateTime .Now;
- Console .WriteLine("并行运算ForEach运行时长:{0}毫秒。" , (dt2 - dt1).TotalMilliseconds);
- }
下面是运行结果:
![]()
这里我们可以看出并行循环在执行效率上的优势了。
结论1:在对一个数组内的每一个项做单独处理时,完全可以选择并行循环的方式来提升执行效率。
原理1:并行计算的线程开启是缓步开启的,线程数量1,2,4,8缓步提升。(不详,PLinq最多64个线程,可能这也是64)
二、 并行循环的中断和跳出
当在进行循环时,偶尔会需要中断循环或跳出循环。下面是两种跳出循环的方法Stop和Break,LoopState是循环状态的参数。
- /// <summary>
- /// 中断Stop
- /// </summary>
- private void Demo5()
- {
- List <int > data = Program .Data;
- Parallel .For(0, data.Count, (i, LoopState) =>
- {
- if (data[i] > 5)
- LoopState.Stop();
- Thread .Sleep(500);
- Console .WriteLine(data[i]);
- });
- Console .WriteLine("Stop执行结束。" );
- }
- /// <summary>
- /// 中断Break
- /// </summary>
- private void Demo6()
- {
- List <int > data = Program .Data;
- Parallel .ForEach(data, (i, LoopState) =>
- {
- if (i > 5)
- LoopState.Break();
- Thread .Sleep(500);
- Console .WriteLine(i);
- });
- Console .WriteLine("Break执行结束。" );
- }
执行结果如下:
![]()
结论2:使用Stop会立即停止循环,使用Break会执行完毕所有符合条件的项。
三、并行循环中为数组/集合添加项
上面的应用场景其实并不是非常多见,毕竟只是为了遍历一个数组内的资源,我们更多的时候是为了遍历资源,找到我们所需要的。那么请继续看。
下面是我们一般会想到的写法:
- private void Demo7()
- {
- List <int > data = new List <int >();
- Parallel .For(0, Program .Data.Count, (i) =>
- {
- if (Program .Data[i] % 2 == 0)
- data.Add(Program .Data[i]);
- });
- Console .WriteLine("执行完成For." );
- }
C# 4.0 Parallel的更多相关文章
- ahjesus C# 4.0 Parallel 并行运算
Parallel.For - for 循环的并行运算 Parallel.ForEach - foreach 循环的并行运算 Parallel.Invoke - 并行调用多个任务 Task - 任务,基 ...
- 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). 其次是 ...
- Parallel.Foreach
随着多核时代的到来,并行开发越来越展示出它的强大威力! 使用并行程序,充分的利用系统资源,提高程序的性能.在.net 4.0中,微软给我们提供了一个新的命名空间:System.Threading.Ta ...
- .Net(C#)Parallel"循环"的解释以及与循环的比较
Parallel 类提供对并行循环和区域的支持. 许多个人计算机和工作站都有两个或四个内核(即 CPU),使多个线程能够同时执行. 在不久的将来,计算机预期会有更多的内核. 为了利用当今和未来的硬件, ...
- C# 4.0 并行计算部分
C# 4.0 并行计算部分 c#linq算法多线程list微软 目录(?)[-] C 40 并行计算部分 一简单使用 二 并行循环的中断和跳出 三并行循环中为数组集合添加项 四返回集合运算结果 ...
- Parallel多线程
随着多核时代的到来,并行开发越来越展示出它的强大威力!使用并行程序,充分的利用系统资源,提高程序的性能.在.net 4.0中,微软给我们提供了一个新的命名空间:System.Threading.Tas ...
- C# Parallel并发执行相关问题
1.Parallel并发执行 using System;using System.Collections.Generic;using System.Linq;using System.Text;usi ...
- Pig parallel reduce并行执行数
parallel语句可以附加到Pig Latin中任一个关系操作符后面,然后它会控制reduce阶段的并行,因此只有对与可以触发reduce过程的操作符才有意义. 可以触发reduce过程的操 ...
- 一、并行编程 - 数据并行 System.Threading.Tasks.Parallel 类
一.并行概念 1.并行编程 在.NET 4中的并行编程是依赖Task Parallel Library(后面简称为TPL) 实现的.在TPL中,最基本的执行单元是task(中文可以理解为"任 ...
随机推荐
- 第三十讲:Android之Animation(五)
天行健,君子以自强不息.--<周易·乾·象> 本讲内容:逐帧动画 Frame Animation 逐帧动画 Frame Animation就是说一帧一帧的连起来播放就变成了动画,和放电影的 ...
- SettingsProvider 它SettingsCache
转载请注明出处:http://blog.csdn.net/droyon/article/details/35558437 SettingsCache,如指出,SettingsProvider缓冲.这将 ...
- 如何解决FormView中实现DropDownList连动选择时出现 "Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的错误
原文:如何解决FormView中实现DropDownList连动选择时出现 "Eval().XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用" 的 ...
- 运用TWaver 3D 矢量图形处理能力
的确,提起TWaver,大家想到的首先是"电信拓扑图组件".事实上.因为其灵活的MVC架构.矢量化设计.方便定制等特点.TWaver能够做的还有非常多.比如房地产行业常见到的&qu ...
- linux_创建用户_copy远程文件_解压缩_执行
查看历史命令: history 创建用户: sudo useradd -m -s /bin/bash cph [会自动创建cph文件夹,并将才cph文件夹权限和组设为cph] 创建用户密码: pas ...
- maven_修改setting ,改为自己私服或者OSC开源中国 [为解决sqlite-jdbc 在中央仓库找不到]
因为项目要使用到sqlite ,虽然有现成的jar,但是考虑的项目的易用统一管理,决定还是用maven 结果纠结了半天 sqlite-jdbc 在maven默认的仓库根本找不着,于是乎修改 setti ...
- IOS新手教程(二)-控制流
int main(){ //2.控制流 //2.1 if语句 //1. if(expression){ } //2. if(expression){ }else{ } //3.能够有0个或是多个els ...
- iOS、真机调试
Xcode中IOS.真机测试 一.购买开发者账号(需要有信用卡.每年支付$99.0) 二.直接淘宝购买一个.用于测试,但是不能上传App 1.获取手机的UUID(Identifier xxxxxx9e ...
- Web API 2 对 CORS 的支持
Web API 2 对 CORS 的支持 CORS概念 跨域资源共享 (CORS) 是一种万维网联合会 (W3C) 规范(通常被认为是 HTML5 的一部分),它可让 JavaScript 克服由浏览 ...
- POJ3342——Party at Hali-Bula
Party at Hali-Bula Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 5418 Accepted: 192 ...