Parallel.Invoke 并行的使用
Parallel类 在System.Threading.Tasks 命名空间下
下面有几个方法,这里讲一下Invoke的用法

下面我们定义几个方法方便测试
先自定义Response 防止并行的时候占用导致结果变化
HttpResponse MyResponse = System.Web.HttpContext.Current.Response;
public void ResponseWrite1()
{
string str = "1:";
for (int i = ; i < ; i++)
{
System.Threading.Thread.Sleep();
str += i;
}
lock (MyResponse)
{
MyResponse.Write(str + "<br /><br />");
}
} public void ResponseWrite2()
{
string str = "2:";
for (int i = ; i < ; i++)
{
System.Threading.Thread.Sleep();
str += i;
}
lock (MyResponse)
{
MyResponse.Write(str + "<br /><br />");
}
} public void ResponseWrite3()
{
string str = "3:";
for (int i = ; i < ; i++)
{
System.Threading.Thread.Sleep();
str += i;
}
lock (MyResponse)
{
MyResponse.Write(str + "<br /><br />");
}
}
接下来开始使用并行
可以通过以下方式并行执行不带参数的方法(☆☆ Invoke只能传入方法名)
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
ResponseWrite1();
ResponseWrite2();
ResponseWrite3(); watch.Stop();
MyResponse.Write($"<br />普通串行耗时:{ watch.Elapsed.Milliseconds }毫秒<br /><br />"); System.Diagnostics.Stopwatch watch2 = new System.Diagnostics.Stopwatch();
watch2.Start(); Parallel.Invoke(ResponseWrite1, ResponseWrite2,ResponseWrite3); watch2.Stop();
MyResponse.Write($"<br />使用并行耗时:{ watch2.Elapsed.Milliseconds }毫秒<br /><br />");
执行结果如下:(☆☆☆ 特别需要注意的是通过Invoke执行的顺序是不固定的)

我们可以看到此时执行同样的代码 并行显然更加节省时间
那我们想要执行带参数的方法有没有办法呢?
答案当然是可以的
我们可以通过使用Lambda 的方式来执行(当然也可以使用委托的方式)
先我们测试的方法加个参数
public void ResponseWrite1(string param1 = "test")
{
string str = param1 + "1:";
for (int i = ; i < ; i++)
{
System.Threading.Thread.Sleep();
str += i;
}
lock (MyResponse)
{
MyResponse.Write(str + "<br /><br />");
}
}
通过lambda执行带参的方法
System.Diagnostics.Stopwatch watch = new System.Diagnostics.Stopwatch();
watch.Start();
ResponseWrite1();
ResponseWrite2();
ResponseWrite3(); watch.Stop();
MyResponse.Write($"<br />普通串行耗时:{ watch.Elapsed.Milliseconds }毫秒<br /><br />"); System.Diagnostics.Stopwatch watch2 = new System.Diagnostics.Stopwatch();
watch2.Start(); Parallel.Invoke(
() => ResponseWrite1("哈哈哈"),
() => ResponseWrite2(),
delegate() {
ResponseWrite3();
}
);
watch2.Stop();
MyResponse.Write($"<br />使用并行耗时:{ watch2.Elapsed.Milliseconds }毫秒<br /><br />");

Parallel.Invoke方法只有在所有方法全部执行完毕后才会返回,即使在方法执行过程中出现异常Invoke也会完成
所以我们在使用 Parallel.Invoke的时候也要考虑里面的方法执行时间是否差不多,如果有一个方法运行时间比较长,也会拖累其他方法(因为Invoke会等所有方法执行完毕后才会返回)
以上就是Parallel.Invoke的用法,如果有不对或者可以改进的地方,欢迎留言
Parallel.Invoke 并行的使用的更多相关文章
- Parallel.Invoke并行你的代码
Parallel.Invoke并行你的代码 使用Parallel.Invoke并行你的代码 优势和劣势 使用Parallel.Invoke的优势就是使用它执行很多的方法很简单,而不用担心任务或者线程的 ...
- 使用Parallel.Invoke并行你的代码
优势和劣势 使用Parallel.Invoke的优势就是使用它执行很多的方法很简单,而不用担心任务或者线程的问题.然而,它并不是适合所有的场景.Parallel.Invoke有很多的劣势 如果你使用它 ...
- C#并行编程--命令式数据并行(Parallel.Invoke)---与匿名函数一起理解(转载整理)
命令式数据并行 Visual C# 2010和.NETFramework4.0提供了很多令人激动的新特性,这些特性是为应对多核处理器和多处理器的复杂性设计的.然而,因为他们包括了完整的新的特性,开 ...
- C#并行编程--命令式数据并行(Parallel.Invoke)
命令式数据并行 Visual C# 2010和.NETFramework4.0提供了很多令人激动的新特性,这些特性是为应对多核处理器和多处理器的复杂性设计的.然而,因为他们包括了完整的新的特性,开 ...
- C#并行编程中的Parallel.Invoke
一.基础知识 并行编程:并行编程是指软件开发的代码,它能在同一时间执行多个计算任务,提高执行效率和性能一种编程方式,属于多线程编程范畴.所以我们在设计过程中一般会将很多任务划分成若干个互相独立子任务, ...
- C# Parallel.Invoke 实现
Parallel.Invoke应该是Parallel几个方法中最简单的一个了,我们来看看它的实现,为了方法大家理解,我尽量保留源码中的注释: public static class Parallel ...
- 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). 其次是 ...
- C#异步编程のParallel(并行)
Parallel是循环中开启多线程 Stopwatch watch1 = new Stopwatch(); watch1.Start(); for (int i = 1; i <= 10; i+ ...
- Parallel.ForEach() 并行循环
现在的电脑几乎都是多核的,但在软件中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很好的发挥多核的优势. 微软的并行运算平台(Microsoft’s Parallel Computing ...
随机推荐
- C#构建DataTable(转)
Asp.net DataTable添加列和行的方法 方法一: DataTable tblDatas = new DataTable("Datas"); DataColumn dc ...
- UCOSii项目在NIOSii上的移植
概览 本次使用Altera公司的NIOS II软核. 使用Quatus工具生成BSP并利用BSP打包工具生成UCOSII嵌入环境. 手动书写LCD驱动与显示函数,对UCOS II加入简单图像显示接口. ...
- js 实现 input type="file" 文件上传示例代码
在开发中,文件上传必不可少但是它长得又丑.浏览的字样不能换,一般会让其隐藏点其他的标签(图片等)来时实现选择文件上传功能 在开发中,文件上传必不可少,<input type="file ...
- 团队作业8----第二次项目冲刺(Beta阶段) 第五天
BETA阶段冲刺第五天 1.小会议ing 2.每个人的工作 (1)昨天已完成的工作 文件读取的方式采用按钮的: (2) 今天计划完成的工作 (3) 工作中遇到的困难: 林莹:源代码的部分我们已经初步完 ...
- GUI(JTabel表格)
/** * */ package com.niit.javagui; import java.util.Vector; import javax.swing.ImageIcon; import jav ...
- 201521123062《Java程序设计》第7周学习总结
1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下: public boolean contains(Object ...
- 201521123042 Java第一周学习总结
1. 201521123042 <Java程序设计>第一周学习总结 a.用notepad++和eclipse编写Java程序 b.安装Java Q1.为什么java程序可以跨平台运行?执行 ...
- 201521123030《Java程序设计》第1周学习总结
#1. 本章学习总结 你对于本章知识的学习总结 了解了java的发展简介 认识了jvm/jre/jdk的联系,学习安装jdk java好麻烦的说... 1.为什么java程序可以跨平台运行?执行jav ...
- 12个Sublime Text应用技巧和诀窍
本文为您提供Sublime Text编辑器的12个技巧和诀窍,深入挖掘这个看似简洁的代码编辑器,背后所隐藏的实现各种高级功能的无限可能. 1) 选择 以下是一些Sublime Text选择文本的快捷键 ...
- 201521123077 《Java程序设计》第10周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. 多线程 Runnable类 表示任务的类,可以当作参数传入Thread的构造器来运行该任务 Thread类 ...