用过.net 异步编程的同学都知道,比以前的多线程编程实现起来真的方便很多,今天把WaitAll和WhenAll这两种编程方式回顾总结一下(当然WaitAny、WhenAny是一样的操作)

1:WaitAll

这个方法在我理解看来,主要是为了解决多个不太相关的操作同步执行的话,耗时较多,这个方法可以使得他们异步同时执行,然后当所有操作都完成以后,再去进行接下来的操作,talk is cheap,show you code!

举个例子:

var response1 = new PriceDataResponse();
var response2 = new PriceDataResponse(); //定义两个异步任务 task1,task2
Task task1 = Task.Factory.StartNew(() =>
{
response1 = SampleFunc();
}); Task task2 = Task.Factory.StartNew(() =>
{
response2 = SampleFunc();
}); //等待两个任务执行完成(同时执行)
Task.WaitAll(task1, task2); //执行完以后,再进行以下操作
if (response1.Prices.Any())
{
return response1;
}
if (response2.Prices.Any())
{
return response2;
}

也就是说,task1 和  task2 两个任务在定义之后就已经马不停蹄的在子线程中运行了,Task.WaitAll 是一个等待的过程,参数就是Task参数,一旦全部执行完毕了,就继续往下执行,这里是阻塞的,还是比较好理解的。

这样的话WaitAny就很好理解了,就是参数里面的Task 有任意一个执行完成,就继续执行后面的逻辑

2:WhenAll

WhenAll其实跟WaitAll是为了实现一样的功能,只是在WaitAll基础上又做了一层包装,看代码就明白了

                var response1 = new PriceDataResponse();
var response2 = new PriceDataResponse(); //定义两个异步任务 task1,task2
Task task1 = Task.Factory.StartNew(() =>
{
response1 = SampleFunc();
}); Task task2 = Task.Factory.StartNew(() =>
{
response2 = SampleFunc();
}); //等待两个任务执行完成(同时执行) Task.WhenAll(task1, task2).ContinueWith(p =>
{
if (response1.Prices.Any())
{
return response1;
}
if (response2.Prices.Any())
{
return response2;
}
return null;
}, TaskContinuationOptions.OnlyOnRanToCompletion);

功能上与WaitAll 是一样,意思就是在两个异步结束了以后,再继续做 ContinueWith 里面的处理这里的 p 相当于是Task,如果前面定义的Task有返回值,那么这里可以用p.Result来取值

WhenAny 是一样的,任意一个完成就执行后面代码

WaitAll 和 WhenAll 的使用及区别的更多相关文章

  1. C# Task WhenAny和WhenAll 以及TaskFactory 的ContinueWhenAny和ContinueWhenAll的实现

    个人感觉Task 的WaitAny和WhenAny以及TaskFactory 的ContinueWhenAny有相似的地方,而WaitAll和WhenAll以及TaskFactory 的Continu ...

  2. C#——线程总结

    #线程详解 1. Thread基础之从 WinDbg 角度理解你必须知道的时间和空间上的开销 一:空间上的开销 1.thread本身来说就是操作系统的概念... <1> thread的内核 ...

  3. [翻译]在 .NET Core 中的并发编程

    原文地址:http://www.dotnetcurry.com/dotnet/1360/concurrent-programming-dotnet-core 今天我们购买的每台电脑都有一个多核心的 C ...

  4. .NET Core 中的并发编程

    今天我们购买的每台电脑都有一个多核心的 CPU,允许它并行执行多个指令.操作系统通过将进程调度到不同的内核来发挥这个结构的优点. 然而,还可以通过异步 I/O 操作和并行处理来帮助我们提高单个应用程序 ...

  5. 温故知新,CSharp遇见异步编程(Async/Await),聊聊异步编程最佳做法

    什么是异步编程(Async/Await) Async/Await本质上是通过编译器实现的语法糖,它让我们能够轻松的写出简洁.易懂.易维护的异步代码. Async/Await是C# 5引入的关键字,用以 ...

  6. c# Task waitAll,WhenAll

    wait 阻塞的 when是异步的非阻塞的. Task[] tlist = new Task[] { Task.Run(() => { Thread.Sleep(3000); }), Task. ...

  7. 【C#】【Thread】ManualResetEvent和AutoResetEvent区别

    ManualResetEvent和AutoResetEvent主要用于线程之间同步问题. 主要使用方法有Set();Reset();WaitOne(); Set():将事件状态设置为终止状态,允许一个 ...

  8. socket网络编程中read与recv区别

    socket网络编程中read与recv区别 1.read 与 recv 区别 read 原则: 数据在不超过指定的长度的时候有多少读多少,没有数据则会一直等待.所以一般情况下:我们读取数据都需要采用 ...

  9. linux下recv 、send阻塞、非阻塞区别和用法

    非阻塞IO 和阻塞IO: 在网络编程中对于一个网络句柄会遇到阻塞IO 和非阻塞IO 的概念, 这里对于这两种socket 先做一下说明:       基本概念: 阻塞IO:: socket 的阻塞模式 ...

随机推荐

  1. C# 三层架构之系统的登录验证与添加数据的实现

    利用三层架构体系,实现学生管理系统中用户的登录与添加班级信息的功能,一下代码为具体实现步骤的拆分过程: 一.用户登录界面功能的实现 1.在数据访问层(LoginDAL)进行对数据库中数据的访问操作 u ...

  2. 常用Dos操作指令

    1 dir 无参数:查看当前所在目录的文件和文件夹. /s:查看当前目录已经其所有子目录的文件和文件夹. /a:查看包括隐含文件的所有文件. /ah:只显示出隐含文件. /w:以紧凑方式(一行显示5个 ...

  3. Android事件传递机制详解及最新源码分析——Activity篇

    版权声明:本文出自汪磊的博客,转载请务必注明出处. 在前两篇我们共同探讨了事件传递机制<View篇>与<ViewGroup篇>,我们知道View触摸事件是ViewGroup传递 ...

  4. CSS背景效果

    前面的话 本文将详细介绍CSS背景效果 条纹背景 [双条纹背景] background:linear-gradient(#fb3 50%, #58a 50%); background-size: 10 ...

  5. poj3463 最短路和比最短路长1的路径数

    这题需要很好的理解Dij. 在Dij的基础上,每个点多一个次短路的长度和数量进行控制. 那么在队列中,最短路控制时出现n次,次短路控制出现n次.注意松弛条件中val值和最短路.次短路的关系. 这题需要 ...

  6. 在STEP7 TIA PORTAL中,设置模块的地址和设备名(Device name)

    assign device name, ip address for PROFINET componet in TIA Portal 方法1: PLC --> online & diag ...

  7. C#之实参和形参

    1.值类型 例如:我们定义一个函数 static void Exchange(int x, int y) { int flag = x; flag = y; y = x; x = flag; } 其中 ...

  8. asp.net MVC下使用rest

    前言 最近做了下个MVC的项目,需要用到rest接口,与java写的应用程序通信,包括数据的接收和发送,那么我将用实用的角度来全面的讲解一下它的使用方法 一.创建rest服务 首先创建一个Asp.Ne ...

  9. base(function strchr)

    函数原型:extern char *strchr(char *str,char character) 参数说明:str为一个字符串的指针,character为一个待查找字符.        所在库名: ...

  10. Win8打开chm右侧空白解决方法

    Win8下打开CHM文件,左侧有目录,但是右侧空白.而且打开的时候,还弹出很多IE窗口. 感觉应该不是文件本身的问题.下面是我的解决方法,其他系统也可以试一试. 最初打开文件如下 首先:1,右键关联c ...