Parallel.Invoke 并行的使用

时间:2022-03-07 06:03:21

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

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

Parallel.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执行的顺序是不固定的)

Parallel.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 并行的使用

Parallel.Invoke方法只有在所有方法全部执行完毕后才会返回,即使在方法执行过程中出现异常Invoke也会完成

所以我们在使用 Parallel.Invoke的时候也要考虑里面的方法执行时间是否差不多,如果有一个方法运行时间比较长,也会拖累其他方法(因为Invoke会等所有方法执行完毕后才会返回)

以上就是Parallel.Invoke的用法,如果有不对或者可以改进的地方,欢迎留言