zoukankan      html  css  js  c++  java
  • Parallel.Invoke 并行的使用

    Parallel类  在System.Threading.Tasks 命名空间下

    下面有几个方法,这里讲一下Invoke的用法

    下面我们定义几个方法方便测试

    先自定义Response 防止并行的时候占用导致结果变化

    HttpResponse MyResponse = System.Web.HttpContext.Current.Response;

    复制代码
            public void ResponseWrite1()
            {
                string str = "1:";
                for (int i = 0; i < 10; i++)
                {
                    System.Threading.Thread.Sleep(15);
                    str += i;
                }
                lock (MyResponse)
                {
                    MyResponse.Write(str + "<br /><br />");
                }
            }
    
            public void ResponseWrite2()
            {
                string str = "2:";
                for (int i = 0; i < 10; i++)
                {
                    System.Threading.Thread.Sleep(15);
                    str += i;
                }
                lock (MyResponse)
                {
                    MyResponse.Write(str + "<br /><br />");
                }
            }
    
            public void ResponseWrite3()
            {
                string str = "3:";
                for (int i = 0; i < 10; i++)
                {
                    System.Threading.Thread.Sleep(15);
                    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 = 0; i < 10; i++)
                {
                    System.Threading.Thread.Sleep(15);
                    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的用法,如果有不对或者可以改进的地方,欢迎留言

    JAVA&NET技术QQ群号:456257217有问题的可以在群里面提问。
  • 相关阅读:
    1 Quartz开始
    1 WCF 一个基础理论 以及如何实现一个简单wcf服务
    计时器timer的使用
    获取当前电脑的cpu使用率、内存使用率
    在asp.net core中使用cookie认证
    在.net core项目中想使用类似iis上面虚拟目录的功能
    有这样一个URL:http://item.taobao.com/item.htm?a=1&b=2&c=&d=xxx&e,请写一段JS程序提取URL中的各个GET参数(参数名和参数个数不确定),将其按key-value形式返回到一个json结构中,如{a:’1′, b:’2′, c:”, d:’xxx’, e:undefined}。
    输出今天的日期,以YYYY-MM-DD的方式,比如今天是2014年9月26日,则输出2014-09-26
    window.onload 和document ready的区别
    call和apply的区别
  • 原文地址:https://www.cnblogs.com/shiyh/p/14955809.html
Copyright © 2011-2022 走看看