-
Task.WaitAll和Task.WaitAny
一、简介
Task.WaitAll:等待所有提供的 Task 对象完成执行过程。Task.WaitAny:等待提供的任一 Task 对象完成执行过程。
二、代码案例
Task.WaitAll
代码:
class Program { public class DownLoadTest { Stopwatch watch = new Stopwatch(); public DownLoadTest() { watch.Start(); } public async Task DoRunTaskAsync(string url, CancellationToken ct) { if (ct.IsCancellationRequested) { Console.WriteLine(string.Format("取消{0}的運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return; } Console.WriteLine(string.Format("下載{0}開始運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); WebClient wc = new WebClient(); await Task.Run(() => { var task = wc.DownloadStringTaskAsync(url); while (!task.IsCompleted) { if (ct.IsCancellationRequested) { Console.WriteLine(string.Format("取消{0}的運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return; } } if (task.IsCompleted) Console.WriteLine(string.Format("下載{0}運行結束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); }); } } static void Main(string[] args) { DownLoadTest dwtest = new DownLoadTest(); CancellationTokenSource cts = new CancellationTokenSource(); CancellationToken token = cts.Token; var task1 = dwtest.DoRunTaskAsync("https://www.baidu.com/", token); var task2 = dwtest.DoRunTaskAsync("https://www.taobao.com/", token); var task3 = dwtest.DoRunTaskAsync("https://www.cnblogs.com/", token); Task[] tasks = new Task[] { task1, task2, task3 }; Console.WriteLine("task.Result等待結果打印"); Task.WaitAll(tasks, 10000); cts.Cancel();//超过10s时间取消运行 Console.WriteLine(task1.Status); Console.WriteLine(task2.Status); Console.WriteLine(task3.Status); Console.WriteLine(string.Format("主線程運行結束")); Console.ReadKey(); } }
运行结果:
通过运行结果可以看出,可以看到Task.WaitAll(tasks)在等待超时的时间内,同步等待了所有的任务完成。
Task.WaitAny
代码:
class Program { public class DownLoadTest { Stopwatch watch = new Stopwatch(); public DownLoadTest() { watch.Start(); } public async Task DoRunTaskAsync(string url, CancellationToken ct) { if (ct.IsCancellationRequested) { Console.WriteLine(string.Format("取消{0}的運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return; } Console.WriteLine(string.Format("下載{0}開始運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); WebClient wc = new WebClient(); await Task.Run(() => { var task = wc.DownloadStringTaskAsync(url); while (!task.IsCompleted) { if (ct.IsCancellationRequested) { Console.WriteLine(string.Format("取消{0}的運行 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); return; } } if (task.IsCompleted) Console.WriteLine(string.Format("下載{0}運行結束 :{1,4:N0}ms", url, watch.Elapsed.TotalMilliseconds)); }); } } static void Main(string[] args) { DownLoadTest dwtest = new DownLoadTest(); CancellationTokenSource cts = new CancellationTokenSource(); CancellationToken token = cts.Token; var task1 = dwtest.DoRunTaskAsync("https://www.baidu.com/", token); var task2 = dwtest.DoRunTaskAsync("https://www.taobao.com/", token); var task3 = dwtest.DoRunTaskAsync("https://www.cnblogs.com/", token); Task[] tasks = new Task[] { task1, task2, task3 }; Console.WriteLine("task.Result等待結果打印"); Task.WaitAny(tasks, 4000); cts.Cancel();//超过4s时间取消运行 Console.WriteLine(task1.Status); Console.WriteLine(task2.Status); Console.WriteLine(task3.Status); Console.WriteLine(string.Format("主線程運行結束")); Console.ReadKey(); } }
运行结果:
通过运行结果截图可以看出,可以看到,Task.WhenAny(tasks)至少等待了一个任务的完成。这里https://www.baidu.com/先下载完,就直接终止等待 。
三、总结
Task.WaitAll阻止当前线程,直到所有其他任务完成执行为止。Task.WaitAny阻止当前线程,至少等待一个任务完成执行为止。如果等待时长设置较长,上述案例结果会一样。
出处:https://www.cnblogs.com/wml-it/p/14861839.html
最新更新
求1000阶乘的结果末尾有多少个0
详解MyBatis延迟加载是如何实现的
IDEA 控制台中文乱码4种解决方案
SpringBoot中版本兼容性处理的实现示例
Spring的IOC解决程序耦合的实现
详解Spring多数据源如何切换
Java报错:UnsupportedOperationException in Col
使用Spring Batch实现批处理任务的详细教程
java中怎么将多个音频文件拼接合成一个
SpringBoot整合ES多个精确值查询 terms功能实
数据库审计与智能监控:从日志分析到异
SQL Server 中的数据类型隐式转换问题
SQL Server中T-SQL 数据类型转换详解
sqlserver 数据类型转换小实验
SQL Server数据类型转换方法
SQL Server 2017无法连接到服务器的问题解决
SQLServer地址搜索性能优化
Sql Server查询性能优化之不可小觑的书签查
SQL Server数据库的高性能优化经验总结
SQL SERVER性能优化综述(很好的总结,不要错
uniapp/H5 获取手机桌面壁纸 (静态壁纸)
[前端] DNS解析与优化
为什么在js中需要添加addEventListener()?
JS模块化系统
js通过Object.defineProperty() 定义和控制对象
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比