C# Task.WaitAll 方法
定义命名空间:System.Threading.Tasks程序集:mscorlib.dll, netstandard.dll等待所有提供的Task对象完成执行过程。重载重载WaitAll(Task[])等待提供的所有Task对象完成执行过程。WaitAll(Task[], Int32)等待所有提供的Task在指定的毫秒数内完成执行。WaitAll(Task[], CancellationToken
定义
命名空间:
程序集:
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 实例的数组。
例外
tasks
中的一个或多个 Task 对象已释放。
tasks
参数为 null
。
tasks
参数包含一个 null 元素。
至少一个 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 count
Func<object, int> action = (object obj) =>
{
int i = (int)obj;
// Make each thread sleep a different time in order to return a different tick count
Thread.Sleep(i * 100);
// The tasks that receive an argument between 2 and 5 throw exceptions
if (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 tasks
for (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 point
Console.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
等待的毫秒数,或为 Infinite (-1),表示无限期等待。
返回
如果在分配的时间内所有 true
实例都已完成执行,则为 Task;否则为 false
。
例外
tasks
中的一个或多个 Task 对象已释放。
tasks
参数为 null
。
至少一个 Task 实例已取消。 如果任务已取消,则 AggregateException 在其 InnerExceptions 集合中包含 OperationCanceledException。
- 或 - 在至少一个 Task 实例的执行过程中引发了异常。
millisecondsTimeout
是一个非 -1 的负数,而 -1 表示无限期超时。
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
。
tasks
参数为 null
。
至少一个 Task 实例已取消。 如果任务已取消,则 AggregateException 在其 InnerExceptions 集合中包含 OperationCanceledException。
- 或 - 在至少一个 Task 实例的执行过程中引发了异常。
tasks
参数包含一个 null 元素。
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,或表示 -1 毫秒(无限期等待)的 TimeSpan。
返回
如果在分配的时间内所有 true
实例都已完成执行,则为 Task;否则为 false
。
例外
tasks
中的一个或多个 Task 对象已释放。
tasks
参数为 null
。
至少一个 Task 实例已取消。 如果任务已取消,则 AggregateException 在其 InnerExceptions 集合中包含 OperationCanceledException。
- 或 - 在至少一个 Task 实例的执行过程中引发了异常。
timeout
为 -1 毫秒以外的负数,表示无限期超时。 - 或 - timeout
大于 MaxValue。
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
等待的毫秒数,或为 Infinite (-1),表示无限期等待。
cancellationToken
等待任务完成期间要观察的 CancellationToken。
返回
如果在分配的时间内所有 true
实例都已完成执行,则为 Task;否则为 false
。
例外
tasks
中的一个或多个 Task 对象已释放。
tasks
参数为 null
。
至少一个 Task 实例已取消。 如果任务已取消,则 AggregateException 在其 InnerExceptions 集合中包含 OperationCanceledException。
- 或 - 在至少一个 Task 实例的执行过程中引发了异常。
millisecondsTimeout
是一个非 -1 的负数,而 -1 表示无限期超时。
tasks
参数包含一个 null 元素。
已取消 cancellationToken
。
注解
cancellationToken
参数用于取消等待操作。 取消任务是一种不同的操作,并按上面所述的方式发出通知 AggregateException 。
适用于
.NET 6 和其他版本
更多推荐
所有评论(0)