public:
static System::Threading::Tasks::Task ^ WhenAll(System::Collections::Generic::IEnumerable<System::Threading::Tasks::Task ^> ^ tasks);
public static System.Threading.Tasks.Task WhenAll (System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task> tasks);
static member WhenAll : seq<System.Threading.Tasks.Task> -> System.Threading.Tasks.Task
Public Shared Function WhenAll (tasks As IEnumerable(Of Task)) As Task
以下示例创建一组任务,用于对数组中的 URL 执行 ping 操作。 任务存储在传递给方法的集合中
List<Task>
WhenAll(IEnumerable<Task>)
。 在调用
Wait
该方法可确保所有线程都已完成之后,该示例将检查
Task.Status
该属性以确定是否有任何任务出错。
using System;
using System.Collections.Generic;
using System.Net.NetworkInformation;
using System.Threading;
using System.Threading.Tasks;
public class Example
public static void Main()
int failed = 0;
var tasks = new List<Task>();
String[] urls = { "www.adatum.com", "www.cohovineyard.com",
"www.cohowinery.com", "www.northwindtraders.com",
"www.contoso.com" };
foreach (var value in urls) {
var url = value;
tasks.Add(Task.Run( () => { var png = new Ping();
try {
var reply = png.Send(url);
if (! (reply.Status == IPStatus.Success)) {
Interlocked.Increment(ref failed);
throw new TimeoutException("Unable to reach " + url + ".");
catch (PingException) {
Interlocked.Increment(ref failed);
throw;
Task t = Task.WhenAll(tasks);
try {
t.Wait();
catch {}
if (t.Status == TaskStatus.RanToCompletion)
Console.WriteLine("All ping attempts succeeded.");
else if (t.Status == TaskStatus.Faulted)
Console.WriteLine("{0} ping attempts failed", failed);
// The example displays output like the following:
// 5 ping attempts failed
Imports System.Collections.Generic
Imports System.Net.NetworkInformation
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim failed As Integer = 0
Dim tasks As New List(Of Task)()
Dim urls() As String = { "www.adatum.com", "www.cohovineyard.com",
"www.cohowinery.com", "www.northwindtraders.com",
"www.contoso.com" }
For Each value In urls
Dim url As String = value
tasks.Add(Task.Run( Sub()
Dim png As New Ping()
Dim reply = png.Send(url)
If Not reply.Status = IPStatus.Success Then
Interlocked.Increment(failed)
Throw New TimeoutException("Unable to reach " + url + ".")
End If
Catch e As PingException
Interlocked.Increment(failed)
Throw
End Try
End Sub))
Dim t As Task = Task.WhenAll(tasks)
t.Wait()
Catch
End Try
If t.Status = TaskStatus.RanToCompletion
Console.WriteLine("All ping attempts succeeded.")
ElseIf t.Status = TaskStatus.Faulted
Console.WriteLine("{0} ping attempts failed", failed)
End If
End Sub
End Module
' The example displays output like the following:
' 5 ping attempts failed
当对一
Task
组任务的状态或一组任务引发的异常感兴趣时,通常会调用返回对象的方法重载
WhenAll
。
对方法的
WhenAll(IEnumerable<Task>)
调用不会阻止调用线程。
如果提供的任何任务都以错误状态完成,则返回的任务也将以
Faulted
状态完成,其中其异常将包含每个提供的任务的未包装异常集的聚合。
如果提供的任务均未出错,但其中至少一个任务已取消,则返回的任务将以
Canceled
状态结束。
如果未出错任何任务且未取消任何任务,则生成的任务将以
RanToCompletion
状态结束。
如果提供的数组/可枚举不包含任何任务,则返回的任务将在返回给调用方之前立即转换为
RanToCompletion
状态。
public:
static System::Threading::Tasks::Task ^ WhenAll(... cli::array <System::Threading::Tasks::Task ^> ^ tasks);
public static System.Threading.Tasks.Task WhenAll (params System.Threading.Tasks.Task[] tasks);
static member WhenAll : System.Threading.Tasks.Task[] -> System.Threading.Tasks.Task
Public Shared Function WhenAll (ParamArray tasks As Task()) As Task
以下示例创建一组任务,用于对数组中的 URL 执行 ping 操作。 任务存储在转换为数组并传递给方法的集合中
List<Task>
WhenAll(IEnumerable<Task>)
。 在调用
Wait
该方法可确保所有线程都已完成之后,该示例将检查
Task.Status
该属性以确定是否有任何任务出错。
using System;
using System.Collections.Generic;
using System.Net.NetworkInformation;
using System.Threading;
using System.Threading.Tasks;
public class Example
public static async Task Main()
int failed = 0;
var tasks = new List<Task>();
String[] urls = { "www.adatum.com", "www.cohovineyard.com",
"www.cohowinery.com", "www.northwindtraders.com",
"www.contoso.com" };
foreach (var value in urls) {
var url = value;
tasks.Add(Task.Run( () => { var png = new Ping();
try {
var reply = png.Send(url);
if (! (reply.Status == IPStatus.Success)) {
Interlocked.Increment(ref failed);
throw new TimeoutException("Unable to reach " + url + ".");
catch (PingException) {
Interlocked.Increment(ref failed);
throw;
Task t = Task.WhenAll(tasks.ToArray());
try {
await t;
catch {}
if (t.Status == TaskStatus.RanToCompletion)
Console.WriteLine("All ping attempts succeeded.");
else if (t.Status == TaskStatus.Faulted)
Console.WriteLine("{0} ping attempts failed", failed);
// The example displays output like the following:
// 5 ping attempts failed
Imports System.Collections.Generic
Imports System.Net.NetworkInformation
Imports System.Threading
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim failed As Integer = 0
Dim tasks As New List(Of Task)()
Dim urls() As String = { "www.adatum.com", "www.cohovineyard.com",
"www.cohowinery.com", "www.northwindtraders.com",
"www.contoso.com" }
For Each value In urls
Dim url As String = value
tasks.Add(Task.Run( Sub()
Dim png As New Ping()
Dim reply = png.Send(url)
If Not reply.Status = IPStatus.Success Then
Interlocked.Increment(failed)
Throw New TimeoutException("Unable to reach " + url + ".")
End If
Catch e As PingException
Interlocked.Increment(failed)
Throw
End Try
End Sub))
Dim t As Task = Task.WhenAll(tasks.ToArray())
t.Wait()
Catch
End Try
If t.Status = TaskStatus.RanToCompletion
Console.WriteLine("All ping attempts succeeded.")
ElseIf t.Status = TaskStatus.Faulted
Console.WriteLine("{0} ping attempts failed", failed)
End If
End Sub
End Module
' The example displays output like the following:
' 5 ping attempts failed
当对一
Task
组任务的状态或一组任务引发的异常感兴趣时,通常会调用返回对象的方法重载
WhenAll
。
对方法的
WhenAll(Task[])
调用不会阻止调用线程。
如果提供的任何任务都以错误状态完成,则返回的任务也将以
Faulted
状态完成,其中其异常将包含每个提供的任务的未包装异常集的聚合。
如果提供的任务均未出错,但其中至少一个任务已取消,则返回的任务将以
Canceled
状态结束。
如果未出错任何任务且未取消任何任务,则生成的任务将以
RanToCompletion
状态结束。
如果提供的数组/可枚举不包含任何任务,则返回的任务将在返回给调用方之前立即转换为
RanToCompletion
状态。
public:
generic <typename TResult>
static System::Threading::Tasks::Task<cli::array <TResult> ^> ^ WhenAll(System::Collections::Generic::IEnumerable<System::Threading::Tasks::Task<TResult> ^> ^ tasks);
public static System.Threading.Tasks.Task<TResult[]> WhenAll<TResult> (System.Collections.Generic.IEnumerable<System.Threading.Tasks.Task<TResult>> tasks);
static member WhenAll : seq<System.Threading.Tasks.Task<'Result>> -> System.Threading.Tasks.Task<'Result[]>
Public Shared Function WhenAll(Of TResult) (tasks As IEnumerable(Of Task(Of TResult))) As Task(Of TResult())
TResult
以下示例创建 10 个任务,其中每个任务实例化一个随机数生成器,该生成器在 1 到 1,000 之间创建 1,000 个随机数并计算其平均值。 该方法
Delay(Int32)
用于延迟随机数生成器的实例化,以便不会使用相同的种子值创建它们。 然后,对该方法的
WhenAll
调用返回一个
Int64
数组,其中包含每个任务计算的平均值。 然后,这些值用于计算总体平均值。
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
public class Example
public static void Main()
var tasks = new List<Task<long>>();
for (int ctr = 1; ctr <= 10; ctr++) {
int delayInterval = 18 * ctr;
tasks.Add(Task.Run(async () => { long total = 0;
await Task.Delay(delayInterval);
var rnd = new Random();
// Generate 1,000 random numbers.
for (int n = 1; n <= 1000; n++)
total += rnd.Next(0, 1000);
return total; } ));
var continuation = Task.WhenAll(tasks);
try {
continuation.Wait();
catch (AggregateException)
if (continuation.Status == TaskStatus.RanToCompletion) {
long grandTotal = 0;
foreach (var result in continuation.Result) {
grandTotal += result;
Console.WriteLine("Mean: {0:N2}, n = 1,000", result/1000.0);
Console.WriteLine("\nMean of Means: {0:N2}, n = 10,000",
grandTotal/10000);
// Display information on faulted tasks.
else {
foreach (var t in tasks) {
Console.WriteLine("Task {0}: {1}", t.Id, t.Status);
// The example displays output like the following:
// Mean: 506.34, n = 1,000
// Mean: 504.69, n = 1,000
// Mean: 489.32, n = 1,000
// Mean: 505.96, n = 1,000
// Mean: 515.31, n = 1,000
// Mean: 499.94, n = 1,000
// Mean: 496.92, n = 1,000
// Mean: 508.58, n = 1,000
// Mean: 494.88, n = 1,000
// Mean: 493.53, n = 1,000
// Mean of Means: 501.55, n = 10,000
Imports System.Collections.Generic
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim tasks As New List(Of Task(Of Long))()
For ctr As Integer = 1 To 10
Dim delayInterval As Integer = 18 * ctr
tasks.Add(Task.Run(Async Function()
Dim total As Long = 0
Await Task.Delay(delayInterval)
Dim rnd As New Random()
' Generate 1,000 random numbers.
For n As Integer = 1 To 1000
total += rnd.Next(0, 1000)
Return total
End Function))
Dim continuation = Task.WhenAll(tasks)
continuation.Wait()
Catch ae As AggregateException
End Try
If continuation.Status = TaskStatus.RanToCompletion Then
Dim grandTotal As Long = 0
For Each result in continuation.Result
grandTotal += result
Console.WriteLine("Mean: {0:N2}, n = 1,000", result/1000)
Console.WriteLine()
Console.WriteLine("Mean of Means: {0:N2}, n = 10,000",
grandTotal/10000)
' Display information on faulted tasks.
For Each t In tasks
Console.WriteLine("Task {0}: {1}", t.Id, t.Status)
End If
End Sub
End Module
' The example displays output like the following:
' Mean: 506.34, n = 1,000
' Mean: 504.69, n = 1,000
' Mean: 489.32, n = 1,000
' Mean: 505.96, n = 1,000
' Mean: 515.31, n = 1,000
' Mean: 499.94, n = 1,000
' Mean: 496.92, n = 1,000
' Mean: 508.58, n = 1,000
' Mean: 494.88, n = 1,000
' Mean: 493.53, n = 1,000
' Mean of Means: 501.55, n = 10,000
在这种情况下,10 个单个任务存储在对象
List<T>
中。
List<T>
实现
IEnumerable<T>
接口。
对方法的
WhenAll<TResult>(IEnumerable<Task<TResult>>)
调用不会阻止调用线程。 但是,对返回
Result
属性的调用确实会阻止调用线程。
如果提供的任何任务都以错误状态完成,则返回的任务也将以
Faulted
状态完成,其中其异常将包含每个提供的任务的未包装异常集的聚合。
如果提供的任务均未出错,但其中至少一个任务已取消,则返回的任务将以
Canceled
状态结束。
如果未出错任何任务且未取消任何任务,则生成的任务将以
RanToCompletion
状态结束。
Task<TResult>.Result
返回的任务的属性将设置为一个数组,其中包含提供的任务的所有结果,其顺序与所提供的任务的顺序相同 (,例如,如果输入任务数组包含 t1,t2, t3,输出任务
Task<TResult>.Result
的属性将返回一个
TResult[]
位置
arr[0] == t1.Result, arr[1] == t2.Result, and arr[2] == t3.Result)
。
tasks
如果参数不包含任何任务,则返回的任务将在返回给调用方之前立即转换为
RanToCompletion
状态。 返回
TResult[]
的元素为 0 个元素的数组。
public:
generic <typename TResult>
static System::Threading::Tasks::Task<cli::array <TResult> ^> ^ WhenAll(... cli::array <System::Threading::Tasks::Task<TResult> ^> ^ tasks);
public static System.Threading.Tasks.Task<TResult[]> WhenAll<TResult> (params System.Threading.Tasks.Task<TResult>[] tasks);
static member WhenAll : System.Threading.Tasks.Task<'Result>[] -> System.Threading.Tasks.Task<'Result[]>
Public Shared Function WhenAll(Of TResult) (ParamArray tasks As Task(Of TResult)()) As Task(Of TResult())
TResult
以下示例创建 10 个任务,其中每个任务实例化一个随机数生成器,该生成器在 1 到 1,000 之间创建 1,000 个随机数并计算其平均值。 在这种情况下,十个单个任务存储在数组中
Task<Int64>
。 该方法
Delay(Int32)
用于延迟随机数生成器的实例化,以便不会使用相同的种子值创建它们。 然后,对该方法的
WhenAll
调用返回一个
Int64
数组,其中包含每个任务计算的平均值。 然后,这些值用于计算总体平均值。
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
public class Example
public static void Main()
var tasks = new Task<long>[10];
for (int ctr = 1; ctr <= 10; ctr++) {
int delayInterval = 18 * ctr;
tasks[ctr - 1] = Task.Run(async () => { long total = 0;
await Task.Delay(delayInterval);
var rnd = new Random();
// Generate 1,000 random numbers.
for (int n = 1; n <= 1000; n++)
total += rnd.Next(0, 1000);
return total; } );
var continuation = Task.WhenAll(tasks);
try {
continuation.Wait();
catch (AggregateException)
if (continuation.Status == TaskStatus.RanToCompletion) {
long grandTotal = 0;
foreach (var result in continuation.Result) {
grandTotal += result;
Console.WriteLine("Mean: {0:N2}, n = 1,000", result/1000.0);
Console.WriteLine("\nMean of Means: {0:N2}, n = 10,000",
grandTotal/10000);
// Display information on faulted tasks.
else {
foreach (var t in tasks)
Console.WriteLine("Task {0}: {1}", t.Id, t.Status);
// The example displays output like the following:
// Mean: 506.38, n = 1,000
// Mean: 501.01, n = 1,000
// Mean: 505.36, n = 1,000
// Mean: 492.00, n = 1,000
// Mean: 508.36, n = 1,000
// Mean: 503.99, n = 1,000
// Mean: 504.95, n = 1,000
// Mean: 508.58, n = 1,000
// Mean: 490.23, n = 1,000
// Mean: 501.59, n = 1,000
// Mean of Means: 502.00, n = 10,000
Imports System.Collections.Generic
Imports System.Threading.Tasks
Module Example
Public Sub Main()
Dim tasks(9) As Task(Of Long)
For ctr As Integer = 1 To 10
Dim delayInterval As Integer = 18 * ctr
tasks(ctr - 1) =Task.Run(Async Function()
Dim total As Long = 0
Await Task.Delay(delayInterval)
Dim rnd As New Random()
' Generate 1,000 random numbers.
For n As Integer = 1 To 1000
total += rnd.Next(0, 1000)
Return total
End Function)
Dim continuation = Task.WhenAll(tasks)
continuation.Wait()
Catch ae As AggregateException
End Try
If continuation.Status = TaskStatus.RanToCompletion Then
Dim grandTotal As Long = 0
For Each result in continuation.Result
grandTotal += result
Console.WriteLine("Mean: {0:N2}, n = 1,000", result/1000)
Console.WriteLine()
Console.WriteLine("Mean of Means: {0:N2}, n = 10,000",
grandTotal/10000)
' Display information on faulted tasks.
For Each t In tasks
Console.WriteLine("Task {0}: {1}", t.Id, t.Status)
End If
End Sub
End Module
' The example displays output like the following:
' Mean: 506.38, n = 1,000
' Mean: 501.01, n = 1,000
' Mean: 505.36, n = 1,000
' Mean: 492.00, n = 1,000
' Mean: 508.36, n = 1,000
' Mean: 503.99, n = 1,000
' Mean: 504.95, n = 1,000
' Mean: 508.58, n = 1,000
' Mean: 490.23, n = 1,000
' Mean: 501.59, n = 1,000
' Mean of Means: 502.00, n = 10,000
对方法的
WhenAll<TResult>(Task<TResult>[])
调用不会阻止调用线程。 但是,对返回
Result
属性的调用确实会阻止调用线程。
如果提供的任何任务都以错误状态完成,则返回的任务也将以
Faulted
状态完成,其中其异常将包含每个提供的任务的未包装异常集的聚合。
如果提供的任务均未出错,但其中至少一个任务已取消,则返回的任务将以
Canceled
状态结束。
如果未出错任何任务且未取消任何任务,则生成的任务将以
RanToCompletion
状态结束。 返回
Result
的任务将设置为一个数组,其中包含提供的任务的所有结果,其顺序与所提供的任务的顺序相同 (,例如,如果输入任务数组包含 t1,t2,t3,输出任务
Result
将返回一个
TResult[]
位置
arr[0] == t1.Result, arr[1] == t2.Result, and arr[2] == t3.Result)
。
如果提供的数组/可枚举不包含任何任务,则返回的任务将在返回给调用方之前立即转换为
RanToCompletion
状态。 返回
TResult[]
的元素为 0 个元素的数组。