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. 0908期 HTML 样式表属性

    1.背景与前景    /*背景色,样式表优先级高*/ background-image:url(路径);    /*设置背景图片(默认)*/ background-attachment:fixed;  ...

  2. 使用JSR-303进行校验 @Valid

    一.在SringMVC中使用 使用注解 1.准备校验时使用的JAR validation-api-1.0.0.GA.jar:JDK的接口: hibernate-validator-4.2.0.Fina ...

  3. 【深入Java虚拟机】之七:Javac编译与JIT编译

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/18009455 编译过程 不论是物理机还是虚拟机,大部分的程序代码从开始编译到最终转化成物理 ...

  4. Java运算符和流程控制

    1 运算符 1.1  比较运算符 比较运算符的结果都是boolean类型,也即是要么是true,要么是false. 比较运算符"=="不能写成"=". > ...

  5. 英语学习app案列分析

    很多同学有误解,软件工程课是否就是理论课?或者是几个牛人拼命写代码,其他人打酱油的课?要不然就是学习一个程序语言,搞一个职业培训的课?都不对,软件工程有理论,有实践,更重要的是分析,思辨,总结.在课程 ...

  6. 201521145048《Java程序设计》第5周学习总结

    1. 本章学习总结 2. 书面作业 Q1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 错误 ...

  7. 201521123013 《Java程序设计》第11周学习总结

    1. 本章学习总结 2. 书面作业 Q1.1.互斥访问与同步访问 完成题集4-4(互斥访问)与4-5(同步访问) 1.1 除了使用synchronized修饰方法实现互斥同步访问,还有什么办法实现互斥 ...

  8. SVM原理以及Tensorflow 实现SVM分类(附代码)

    1.1. SVM介绍 1.2. 工作原理 1.2.1. 几何间隔和函数间隔 1.2.2. 最大化间隔 - 1.2.2.0.0.1. \(L( {x}^*)\)对$ {x}^*$求导为0 - 1.2.2 ...

  9. Java内存分配之堆、栈和常量池

    Java内存分配主要包括以下几个区域: 1. 寄存器:我们在程序中无法控制 2. 栈:存放基本类型的数据和对象的引用,但对象本身不存放在栈中,而是存放在堆中 3. 堆:存放用new产生的数据 4. 静 ...

  10. mybatis-basedao的实现

    package com.yangwei.shop.dao; import java.util.HashMap; import java.util.List; import java.util.Map; ...