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 并行的使用的更多相关文章

  1. Parallel.Invoke并行你的代码

    Parallel.Invoke并行你的代码 使用Parallel.Invoke并行你的代码 优势和劣势 使用Parallel.Invoke的优势就是使用它执行很多的方法很简单,而不用担心任务或者线程的 ...

  2. 使用Parallel.Invoke并行你的代码

    优势和劣势 使用Parallel.Invoke的优势就是使用它执行很多的方法很简单,而不用担心任务或者线程的问题.然而,它并不是适合所有的场景.Parallel.Invoke有很多的劣势 如果你使用它 ...

  3. C#并行编程--命令式数据并行(Parallel.Invoke)---与匿名函数一起理解(转载整理)

    命令式数据并行   Visual C# 2010和.NETFramework4.0提供了很多令人激动的新特性,这些特性是为应对多核处理器和多处理器的复杂性设计的.然而,因为他们包括了完整的新的特性,开 ...

  4. C#并行编程--命令式数据并行(Parallel.Invoke)

    命令式数据并行   Visual C# 2010和.NETFramework4.0提供了很多令人激动的新特性,这些特性是为应对多核处理器和多处理器的复杂性设计的.然而,因为他们包括了完整的新的特性,开 ...

  5. C#并行编程中的Parallel.Invoke

    一.基础知识 并行编程:并行编程是指软件开发的代码,它能在同一时间执行多个计算任务,提高执行效率和性能一种编程方式,属于多线程编程范畴.所以我们在设计过程中一般会将很多任务划分成若干个互相独立子任务, ...

  6. C# Parallel.Invoke 实现

    Parallel.Invoke应该是Parallel几个方法中最简单的一个了,我们来看看它的实现,为了方法大家理解,我尽量保留源码中的注释: public static class Parallel ...

  7. 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). 其次是 ...

  8. C#异步编程のParallel(并行)

    Parallel是循环中开启多线程 Stopwatch watch1 = new Stopwatch(); watch1.Start(); for (int i = 1; i <= 10; i+ ...

  9. Parallel.ForEach() 并行循环

    现在的电脑几乎都是多核的,但在软件中并还没有跟上这个节奏,大多数软件还是采用传统的方式,并没有很好的发挥多核的优势. 微软的并行运算平台(Microsoft’s Parallel Computing ...

随机推荐

  1. Redis在java中的使用

    1.首先安装Redis环境.可以在Windows.linux.别的服务器上搭建Redis环境 2.在java工程中导入必须的jar包 如maven上导入两个jar] <!-- Redis必须包 ...

  2. java多线程设计模式

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt220 java多线程设计模式 java语言已经内置了多线程支持,所有实现Ru ...

  3. Maven(一)初识Maven

    前言 在这之前一直都有去看关于Maven的相关介绍,但是没有到真正要用的时候,自己总是以为懂了.其实真的感觉Maven并没有想象的那么简单! 那我们该怎么去学习maven呢?接下来我将从: 初步认识m ...

  4. c# DateTime 类

    获得当前系统时间: DateTime dt = DateTime.Now;Environment.TickCount可以得到"系统启动到现在"的毫秒值DateTime now = ...

  5. vmware 遇到 “无法打开内核设备 \\.\Global\vmx86” 解决

    问题描述:vmware没有正常关闭,再次打开使用时蓝屏,在安全模式下再次打开不会蓝屏,但提示"无法打开内核设备 \.\Global\vmx86: 系统找不到指定的文件,你想要安装VMware ...

  6. 201521123062《Java程序设计》第7周学习总结

    1. 本周学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 源代码如下: public boolean contains(Object ...

  7. 201521123088《Java程序设计》第6周学习总结

    1. 本周学习总结 2. 书面作业 clone方法1.1 Object对象中的clone方法是被protected修饰,在自定义的类中覆盖clone方法时需要注意什么?                 ...

  8. 杨晨露 Java 第一周总结

    1.学习内容总结 (1)Integer类在对象中包装了一个基本类型int的值.Integer类型的对象包含一个int类型的字段.该类提供了多个方法,能在int类型和String类型之间互相转换,还提供 ...

  9. Java课程设计——GUI密码生成器团队博客

    1.团队名称.团队成员介绍(需要有照片) 1.1团队名称 小黄人 1.2团队成员介绍 吴玲:组长,现任院就业会策划部副部长 郭琪容:组员,现任院硬件协会会长 2. 项目git地址 吴 玲 郭琪容 3. ...

  10. 201521123022 《Java程序设计》 第十二周学习总结

    1. 本周学习总结 2. 书面作业 Q1.将Student对象(属性:int id, String name,int age,double grade)写入文件student.data.从文件读出显示 ...