添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
彷徨的豌豆  ·  明清皇陵·  4 月前    · 
冷静的黄花菜  ·  Script not getting ...·  4 月前    · 
开朗的毛衣  ·  Http to https ...·  8 月前    · 
爽快的大蒜  ·  VMware Knowledge Base·  1 年前    · 
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 个元素的数组。