定义

命名空间:

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 方法相关推荐

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

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

  2. .net中Task.WaitAll和WaitAny同步的等待Task完成

    前面讲了<.net中async/await异步编程>,如果方法中使用了多个异步方法,该如何同步的等待Task完成? Task.WaitAll 等待提供的所有 System.Threadin ...

  3. Task.Delay()方法

    Task.Delay方法只会延缓异步方法中后续部分执行时间,当程序执行到await表达时,一方面会立即返回调用方法,执行调用方法中的剩余部分,这一部分程序的执行不会延长.另一方面根据Delay()方法 ...

  4. WaitHandle.WaitAll 方法在WPF工程中的应用

    <?xml version="1.0" encoding="UTF-8"?> 因为WaiAll需要多线程支持, 而WPF是STA模式, 可以通过以下 ...

  5. C#Task执行线程及其相关问题

    对于多线程,我们经常使用的是Thread.在我们了解Task之前,如果我们要使用多核的功能可能就会自己来开线程,然而这种线程模型在.net 4.0之后被一种称为基于"任务的编程模型" ...

  6. 5天玩转C#并行和多线程编程 —— 第五天 多线程编程大总结

    5天玩转C#并行和多线程编程 -- 第五天 多线程编程大总结 5天玩转C#并行和多线程编程系列文章目录 5天玩转C#并行和多线程编程 -- 第一天 认识Parallel 5天玩转C#并行和多线程编程 ...

  7. dnet 并行编程学习总结

    .Net并行编程高级教程--Parallel http://www.cnblogs.com/stoneniqiu/p/4857021.html 一直觉得自己对并发了解不够深入,特别是看了<代码整 ...

  8. 对比Java和.NET多线程编程

    这篇文章以对比的方式总结Java和.NET多线程编程. 基本概念 多线程:很多开发语言都提供多线程编程支持,比如Java,C#. 并发(concurrent):即使对于单核CPU,我们也会采用多线程等 ...

  9. 第十二节:深究内核模式锁的使用场景(自动事件锁、手动事件锁、信号量、互斥锁、读写锁、动态锁)

    一. 整体介绍 温馨提示:内核模式锁,在不到万不得已的情况下,不要使用它,因为代价太大了,有很多种替代方案. 内核模式锁包括: ①:事件锁 ②:信号量 ③:互斥锁 ④:读写锁 ⑤:动态锁 二. 事件锁 ...

最新文章

  1. php 面向对象 创建OOP
  2. ASP.NET页面的生命周期
  3. Java命令行界面(第17部分):jw-options
  4. [转载] Python之Numpy模块中的方法详解
  5. java王者荣耀英雄代码_王者荣耀英雄代码在哪个文件夹_王者荣耀英雄代码大全...
  6. 冰点还原精灵有什么作用
  7. 整车控制器(VCU,vehicle Controller Unit)
  8. ‘dtools’不是内部或外部命令,也不是可运行的程序或批处理文件,个人解决方案
  9. 【DG】基于同一个主机建立物理备库和逻辑备库 (三)
  10. 360查出 HEUR/Malware.QVMxx.Gen 病毒含义
  11. windows系统通过虚拟机安装linux
  12. css立体3d效果动画,css3 实现动画,变换基点及3D效果~
  13. 电子商务应围绕网商、网货、网规三要素 - 卫哲
  14. [面试算法]24点计算
  15. C语言详解|float类型 数据的储存的存储方式详解
  16. GO:切片Slice的概念,使用及线程安全性
  17. 用Kinect来控制鼠标的移动、单击、双击和右击 及PPT控制(Windows sdk)
  18. 安卓滤镜君LR调色大师v2.2.1
  19. php接口返回一个数组怎末写_返回php数组
  20. Oracle常用SQL

热门文章

  1. java音乐_java实现简单音乐播放器
  2. typedef定义的函数指针
  3. JavaScript本地存储详解
  4. 运行ReactNative工程watchman运行错误
  5. mysql之递归树查询
  6. C++程序设计:一元非负正整次数多项式的处理
  7. 揭秘天猫双11背后:AI设计师鹿班为20万客户设计600万张海报
  8. Revit二次开发之材料Material的设置【比目鱼原创】
  9. sogou map 开发 1
  10. maven-assembly-plugin 快速入门(maven assembly 插件)