前面讲了《.net中async/await异步编程》,如果方法中使用了多个异步方法,该如何同步的等待Task完成?

Task.WaitAll 等待提供的所有 System.Threading.Tasks.Task 对象完成执行过程。

DownLoadTest dwtest = new DownLoadTest();
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
var task1 = dwtest.DoRunTaskAsync("https://stackoverflow.com/", token);
var task2 = dwtest.DoRunTaskAsync("https://github.com/", token);
var task3 = dwtest.DoRunTaskAsync("https://www.google.com/", token);
Task[] tasks = new Task[] { task1, task2 , task3 };
Debug.WriteLine("task.Result等待结果打印");
Task.WaitAll(tasks,10000);
cts.Cancel();//超过10s时间取消运行
Console.WriteLine(task1.Status);
Console.WriteLine(task2.Status);
Console.WriteLine(task3.Status);
Debug.WriteLine(string.Format("主线程运行结束"));
Console.ReadKey();

PS:DownLoadTest中的代码查看前面的文章。

执行结果为:

下载https://stackoverflow.com/开始运行 :   1ms
下载https://github.com/开始运行 :  66ms
下载https://www.google.com/开始运行 :  68ms
task.Result等待结果打印
下载https://github.com/运行结束 :2,484ms
下载https://stackoverflow.com/运行结束 :2,571ms
取消https://www.google.com/的运行 :10,074ms
主线程运行结束

控制器打印出来的为

可以看出Task.WaitAll实现了多个异步方法的执行,它有多个重载方法,可以查看.NET帮助文档

Task.WaitAny可以实现等待至少一个任务的完成。修改代码如下:

DownLoadTest dwtest = new DownLoadTest();
CancellationTokenSource cts = new CancellationTokenSource();
CancellationToken token = cts.Token;
var task1 = dwtest.DoRunTaskAsync("https://stackoverflow.com/", token);
var task2 = dwtest.DoRunTaskAsync("https://github.com/", token);
var task3 = dwtest.DoRunTaskAsync("https://www.google.com/", token);
Task[] tasks = new Task[] { task1, task2 , task3 };
Debug.WriteLine("task.Result等待结果打印");
Task.WaitAny(tasks,10000);
cts.Cancel();//超过10s时间取消运行
Debug.WriteLine(task1.Status);
Debug.WriteLine(task2.Status);
Debug.WriteLine(task3.Status);
Debug.WriteLine(string.Format("主线程运行结束"));
Console.ReadKey();

Output输出窗口结果为:

下载https://stackoverflow.com/开始运行 :   1ms
下载https://github.com/开始运行 :  52ms
下载https://www.google.com/开始运行 :  53ms
task.Result等待结果打印
下载https://github.com/运行结束 :1,994ms
WaitingForActivation
RanToCompletion
WaitingForActivation
主线程运行结束
取消https://stackoverflow.com/的运行 :1,997ms
取消https://www.google.com/的运行 :1,997ms

可以看到https://github.com/先下载完,就会执行,取消了其它两个的下载。

它有多个重载方法,可以查看.NET帮助文档

转载于:https://www.cnblogs.com/hueychan/p/10575911.html

.net中Task.WaitAll和WaitAny同步的等待Task完成相关推荐

  1. 在flask中同步调用celery.task函数报错分析

    问题介绍 为方便理解,简单说明一下项目,项目中使用的依赖模块有:flask,flask-sqlalchemy,flask-celery等等. 在同步方式调用task函数的时候出现了DetachedIn ...

  2. C#中的线程(二) 线程同步基础

    1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程 ...

  3. NET问答: 多个 await 和 Task.WaitAll 是等价的吗?

    咨询区 vidalsasoon: 我有下面两个方法: MethodA: 使用多个 await 方式 public async Task<IHttpActionResult> MethodA ...

  4. C# Task.WaitAll 方法

    定义 命名空间: System.Threading.Tasks 程序集: mscorlib.dll, netstandard.dll 等待所有提供的 Task 对象完成执行过程. 重载 重载 Wait ...

  5. 工作中InnoDB引擎数据库主从复制同步心得

    近期将公司的MySQL架构升级了,由原先的一主多从换成了DRBD+Heartbeat双主多从,正好手上有一个电子商务网站新项目也要上线了,用的是DRBD+Heartbeat双主一从,由于此过程还是有别 ...

  6. 阿里mysql数据库同步_如何对MySQL数据库中的数据进行实时同步-阿里云开发者社区...

    数据传输(Data Transmission) 支持以数据库为核心的结构化存储产品之间的数据传输. 它是一种集数据迁移.数据订阅及数据实时同步于一体的数据传输服务.数据传输致力于在公有云.混合云场景下 ...

  7. java同步关键字_Java中synchronized关键字修饰方法同步的用法详解

    Java的最基本的同步方式,即使用synchronized关键字来控制一个方法的并发访问. 每一个用synchronized关键字声明的方法都是临界区.在Java中,同一个对象的临界区,在同一时间只有 ...

  8. [转]关于java中的 sychronized 同步方法 与 同步块的理解

    首先,需要说明一点,也是最重要的一点,无论是同步方法 还是 同步块 都是只针对同一个对象的多线程而言的,只有同一个对象产生的多线程,才会考虑到 同步方法 或者是 同步块,如果定义多个实例的同步,可以考 ...

  9. ISIS—ISIS中LSP(数据库)同步如何保证LSDB可靠性—04

    目录 一.LSP基础知识:(链路状态更新,相当于OSPF的LSA) 二.ISIS中LSP(数据库)同步如何保证LSDB可靠性? ISIS LSP(数据库)同步机制 ①P2P网络: ②MA网络: ③特例 ...

最新文章

  1. Javascript函数的简单学习
  2. Win2008 r2 iis7/iis7.5系统下HTTP重定向(301重定向)图文方法
  3. Linux原始套接字学习总结
  4. Appium——主从控制执行
  5. centos中bash占用cpu,Linux中显示内存和CPU使用率最高的进程和SHELL脚本例子
  6. 软件工程概论个人总结
  7. jtoken判断是否包含键_Redis源码解析十三--有序集合类型键实现(t_zset)
  8. git添加多远端服务器并且实现push代码
  9. iphoneX的适配问题
  10. python成绩管理系统设计 gui csdn_用golang简单编写学生信息管理系统
  11. steam当前计算机无法,steam无法打开【操作思路】
  12. 为什么都不想去中科创达_那些过年不想回家的人,都去了哪?
  13. JS混入(mix-in)小案例
  14. MsDos下的Debug调试器与8080汇编小实验
  15. 高中的班花貌美如花,我与一众兄弟将其“共享”了!
  16. [转] ThreeJS中,那些会让阴影失效的操作
  17. python玩王者荣耀皮肤_python 王者荣耀皮肤高清图片下载 附源码
  18. SQL Developer的下载、安装和连接Oracle数据库
  19. VCS IDEA没有Enable Version Control Intergration
  20. cascade down_cascade是什么意思_cascade的翻译_音标_读音_用法_例句_爱词霸在线词典...

热门文章

  1. 【MyBatis笔记】使用注解开发
  2. 【狂神MyBatis笔记】map作为参数传递类型进行增删改查模糊查询
  3. 【java笔记】可变参数
  4. LeetCode 98 验证二叉搜索树
  5. jQuery 文本编辑器插件 HtmlBox 使用
  6. python发送微信消息_python 发送QQ或者微信消息
  7. html5画直线,小白学canvas-从0到1,画直线
  8. hdfs中8031是什么端口号_删了HDFS又能怎样?记一次删库不跑路事件
  9. java double 存储_可以存储在double中的最大整数
  10. 2021牛客暑期多校训练营10,签到题FH