C# Task.WaitAll 方法
定义
命名空间:
System.Threading.Tasks
程序集:
mscorlib.dll, netstandard.dll
等待所有提供的 Task 对象完成执行过程。
重载
WaitAll(Task[]) |
等待提供的所有 Task 对象完成执行过程。 |
WaitAll(Task[], Int32) |
等待所有提供的 Task 在指定的毫秒数内完成执行。 |
WaitAll(Task[], CancellationToken) |
等待提供的所有 Task 对象完成执行过程(除非取消等待)。 |
WaitAll(Task[], TimeSpan) |
等待所有提供的可取消 Task 对象在指定的时间间隔内完成执行。 |
WaitAll(Task[], Int32, CancellationToken) |
等待提供的所有 Task 对象在指定的毫秒数内完成执行,或等到取消等待。 |
WaitAll(Task[])
等待提供的所有 Task 对象完成执行过程。
C#复制
public static void WaitAll (params System.Threading.Tasks.Task[] tasks);
参数
tasks
Task[]
要等待的 Task 实例的数组。
例外
ObjectDisposedException
tasks
中的一个或多个 Task 对象已释放。
ArgumentNullException
tasks
参数为 null
。
ArgumentException
tasks
参数包含一个 null 元素。
AggregateException
至少一个 Task 实例已取消。 如果任务取消,则 AggregateException 异常在其 InnerExceptions 集合中包含 OperationCanceledException 异常。
- 或 - 在至少一个 Task 实例的执行过程中引发了异常。
示例
下面的示例启动了10个任务,其中每个任务都作为状态对象传递了一个索引。 索引为2到5的任务引发异常。 对方法的调用 WaitAll 会包装对象中的所有异常 AggregateException ,并将其传播到调用线程。
C#复制
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;class Example
{static void Main(){var tasks = new List<Task<int>>();// Define a delegate that prints and returns the system tick countFunc<object, int> action = (object obj) =>{int i = (int)obj;// Make each thread sleep a different time in order to return a different tick countThread.Sleep(i * 100);// The tasks that receive an argument between 2 and 5 throw exceptionsif (2 <= i && i <= 5){throw new InvalidOperationException("SIMULATED EXCEPTION");}int tickCount = Environment.TickCount;Console.WriteLine("Task={0}, i={1}, TickCount={2}, Thread={3}", Task.CurrentId, i, tickCount, Thread.CurrentThread.ManagedThreadId);return tickCount;};// Construct started tasksfor (int i = 0; i < 10; i++){int index = i;tasks.Add(Task<int>.Factory.StartNew(action, index));}try{// Wait for all the tasks to finish.Task.WaitAll(tasks.ToArray());// We should never get to this pointConsole.WriteLine("WaitAll() has not thrown exceptions. THIS WAS NOT EXPECTED.");}catch (AggregateException e){Console.WriteLine("\nThe following exceptions have been thrown by WaitAll(): (THIS WAS EXPECTED)");for (int j = 0; j < e.InnerExceptions.Count; j++){Console.WriteLine("\n-------------------------------------------------\n{0}", e.InnerExceptions[j].ToString());}}}
}
// The example displays output like the following:
// Task=1, i=0, TickCount=1203822250, Thread=3
// Task=2, i=1, TickCount=1203822359, Thread=4
// Task=7, i=6, TickCount=1203823484, Thread=3
// Task=8, i=7, TickCount=1203823890, Thread=4
// Task=9, i=8, TickCount=1203824296, Thread=3
// Task=10, i=9, TickCount=1203824796, Thread=4
//
// The following exceptions have been thrown by WaitAll(): (THIS WAS EXPECTED)
//
// -------------------------------------------------
// System.InvalidOperationException: SIMULATED EXCEPTION
// at Example.<Main>b__0(Object obj)
// at System.Threading.Tasks.Task`1.InnerInvoke()
// at System.Threading.Tasks.Task.Execute()
//
// -------------------------------------------------
// System.InvalidOperationException: SIMULATED EXCEPTION
// at Example.<Main>b__0(Object obj)
// at System.Threading.Tasks.Task`1.InnerInvoke()
// at System.Threading.Tasks.Task.Execute()
//
// -------------------------------------------------
// System.InvalidOperationException: SIMULATED EXCEPTION
// at Example.<Main>b__0(Object obj)
// at System.Threading.Tasks.Task`1.InnerInvoke()
// at System.Threading.Tasks.Task.Execute()
//
// -------------------------------------------------
// System.InvalidOperationException: SIMULATED EXCEPTION
// at Example.<Main>b__0(Object obj)
// at System.Threading.Tasks.Task`1.InnerInvoke()
// at System.Threading.Tasks.Task.Execute()
适用于
.NET 6 和其他版本
WaitAll(Task[], Int32)
等待所有提供的 Task 在指定的毫秒数内完成执行。
C#复制
public static bool WaitAll (System.Threading.Tasks.Task[] tasks, int millisecondsTimeout);
参数
tasks
Task[]
要等待的 Task 实例的数组。
millisecondsTimeout
Int32
等待的毫秒数,或为 Infinite (-1),表示无限期等待。
返回
Boolean
如果在分配的时间内所有 true
实例都已完成执行,则为 Task;否则为 false
。
例外
ObjectDisposedException
tasks
中的一个或多个 Task 对象已释放。
ArgumentNullException
tasks
参数为 null
。
AggregateException
至少一个 Task 实例已取消。 如果任务已取消,则 AggregateException 在其 InnerExceptions 集合中包含 OperationCanceledException。
- 或 - 在至少一个 Task 实例的执行过程中引发了异常。
ArgumentOutOfRangeException
millisecondsTimeout
是一个非 -1 的负数,而 -1 表示无限期超时。
ArgumentException
tasks
参数包含一个 null 元素。
适用于
.NET 6 和其他版本
WaitAll(Task[], CancellationToken)
等待提供的所有 Task 对象完成执行过程(除非取消等待)。
C#复制
public static void WaitAll (System.Threading.Tasks.Task[] tasks, System.Threading.CancellationToken cancellationToken);
参数
tasks
Task[]
要等待的 Task 实例的数组。
cancellationToken
CancellationToken
等待任务完成期间要观察的 CancellationToken。
例外
OperationCanceledException
已取消 cancellationToken
。
ArgumentNullException
tasks
参数为 null
。
AggregateException
至少一个 Task 实例已取消。 如果任务已取消,则 AggregateException 在其 InnerExceptions 集合中包含 OperationCanceledException。
- 或 - 在至少一个 Task 实例的执行过程中引发了异常。
ArgumentException
tasks
参数包含一个 null 元素。
ObjectDisposedException
tasks
中的一个或多个 Task 对象已释放。
注解
cancellationToken
参数用于取消等待操作。 取消任务是一种不同的操作,并由发出信号,如上所述 AggregateException 。
适用于
.NET 6 和其他版本
WaitAll(Task[], TimeSpan)
等待所有提供的可取消 Task 对象在指定的时间间隔内完成执行。
C#复制
public static bool WaitAll (System.Threading.Tasks.Task[] tasks, TimeSpan timeout);
参数
tasks
Task[]
要等待的 Task 实例的数组。
timeout
TimeSpan
表示等待毫秒数的 TimeSpan,或表示 -1 毫秒(无限期等待)的 TimeSpan。
返回
Boolean
如果在分配的时间内所有 true
实例都已完成执行,则为 Task;否则为 false
。
例外
ObjectDisposedException
tasks
中的一个或多个 Task 对象已释放。
ArgumentNullException
tasks
参数为 null
。
AggregateException
至少一个 Task 实例已取消。 如果任务已取消,则 AggregateException 在其 InnerExceptions 集合中包含 OperationCanceledException。
- 或 - 在至少一个 Task 实例的执行过程中引发了异常。
ArgumentOutOfRangeException
timeout
为 -1 毫秒以外的负数,表示无限期超时。 - 或 - timeout
大于 MaxValue。
ArgumentException
tasks
参数包含一个 null 元素。
适用于
.NET 6 和其他版本
WaitAll(Task[], Int32, CancellationToken)
等待提供的所有 Task 对象在指定的毫秒数内完成执行,或等到取消等待。
C#复制
public static bool WaitAll (System.Threading.Tasks.Task[] tasks, int millisecondsTimeout, System.Threading.CancellationToken cancellationToken);
参数
tasks
Task[]
要等待的 Task 实例的数组。
millisecondsTimeout
Int32
等待的毫秒数,或为 Infinite (-1),表示无限期等待。
cancellationToken
CancellationToken
等待任务完成期间要观察的 CancellationToken。
返回
Boolean
如果在分配的时间内所有 true
实例都已完成执行,则为 Task;否则为 false
。
例外
ObjectDisposedException
tasks
中的一个或多个 Task 对象已释放。
ArgumentNullException
tasks
参数为 null
。
AggregateException
至少一个 Task 实例已取消。 如果任务已取消,则 AggregateException 在其 InnerExceptions 集合中包含 OperationCanceledException。
- 或 - 在至少一个 Task 实例的执行过程中引发了异常。
ArgumentOutOfRangeException
millisecondsTimeout
是一个非 -1 的负数,而 -1 表示无限期超时。
ArgumentException
tasks
参数包含一个 null 元素。
OperationCanceledException
已取消 cancellationToken
。
注解
cancellationToken
参数用于取消等待操作。 取消任务是一种不同的操作,并按上面所述的方式发出通知 AggregateException 。
适用于
.NET 6 和其他版本
C# Task.WaitAll 方法相关推荐
- NET问答: 多个 await 和 Task.WaitAll 是等价的吗?
咨询区 vidalsasoon: 我有下面两个方法: MethodA: 使用多个 await 方式 public async Task<IHttpActionResult> MethodA ...
- .net中Task.WaitAll和WaitAny同步的等待Task完成
前面讲了<.net中async/await异步编程>,如果方法中使用了多个异步方法,该如何同步的等待Task完成? Task.WaitAll 等待提供的所有 System.Threadin ...
- Task.Delay()方法
Task.Delay方法只会延缓异步方法中后续部分执行时间,当程序执行到await表达时,一方面会立即返回调用方法,执行调用方法中的剩余部分,这一部分程序的执行不会延长.另一方面根据Delay()方法 ...
- WaitHandle.WaitAll 方法在WPF工程中的应用
<?xml version="1.0" encoding="UTF-8"?> 因为WaiAll需要多线程支持, 而WPF是STA模式, 可以通过以下 ...
- C#Task执行线程及其相关问题
对于多线程,我们经常使用的是Thread.在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于"任务的编程模型" ...
- 5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结
5天玩转C#并行和多线程编程 -- 第五天 多线程编程大总结 5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 -- 第一天 认识Parallel 5天玩转C#并行和多线程编程 ...
- dnet 并行编程学习总结
.Net并行编程高级教程--Parallel http://www.cnblogs.com/stoneniqiu/p/4857021.html 一直觉得自己对并发了解不够深入,特别是看了<代码整 ...
- 对比Java和.NET多线程编程
这篇文章以对比的方式总结Java和.NET多线程编程. 基本概念 多线程:很多开发语言都提供多线程编程支持,比如Java,C#. 并发(concurrent):即使对于单核CPU,我们也会采用多线程等 ...
- 第十二节:深究内核模式锁的使用场景(自动事件锁、手动事件锁、信号量、互斥锁、读写锁、动态锁)
一. 整体介绍 温馨提示:内核模式锁,在不到万不得已的情况下,不要使用它,因为代价太大了,有很多种替代方案. 内核模式锁包括: ①:事件锁 ②:信号量 ③:互斥锁 ④:读写锁 ⑤:动态锁 二. 事件锁 ...
最新文章
- relocation R_X86_64_32S against `.data‘ can not be used when making a PIE object; recompile with -fP
- .net多线程 Thread
- Python 析构方法__del__
- 【Android OpenGL ES 开发 (零)】创建一个新的工程
- 深度相机(二)--结构光深度测距
- 计算机科学技术考研内容,计算机科学技术考研考什么科目
- mysql查看数据库所占用的空间
- grads插值_利用grads描述文件中的pdef做插值的实用方法,转模式的同学看过来~~...
- 写给应届毕业生-------五险一金以及个人所得税缴纳计算
- 链游:不要只争朝夕,要寄望百年
- 90后程序英雄季逸超
- python应用内部审计_软件机器人实现内部审计自动化变革,助力企业转型数字化审计...
- 漫谈阿里那些大数据技术,大数据学习者必看
- java and运算_JAVA中逻辑运算符“|”和“”与“||”和“”的用法
- echarts3在Y轴上做基准线
- unity3d俄罗斯方块源码教程+源码和程序下载
- 《点石成金》 思维导图
- Mysql 内置函数大全
- 算法笔记——基数排序
- 信用卡还款高峰到来小心多付冤枉钱
热门文章
- ramos+装u盘+linux,一键制作SCSI+WIMBOOT RAMOS P驱单镜像内存系统工具V1.8
- 2019中兴迪杰斯特拉比赛回顾与分析
- web安全测试---AppScan扫描工具详解和测试方法说明
- 两个网段共享打印机_不同网段共享打印机怎么设置?不同网段共享打印机设置方法【详解】...
- ThreeJS从实战到源码 - 创建场景
- TypeScript1-TypeScript 简介及环境搭建
- MAX78000FTHR 板卡入门
- (附源码)SSM+mysql+微信小程序网易云音乐设计与实现 毕业设计261620
- 按照打印机会多出来一个副本_安装打印机驱动后为什么出现副本?
- 《游戏设计艺术(第2版)》——学习笔记(30)第30章 设计师要向客户推销自己的想法