Task.WhenAll メソッド

定義

指定されたすべてのタスクが完了してから完了するタスクを作成します。

オーバーロード

WhenAll(IEnumerable<Task>)

列挙可能なコレクション内のすべての Task オブジェクトが完了したときに完了するタスクを作成します。

WhenAll(Task[])

配列内のすべての Task オブジェクトが完了したときに完了するタスクを作成します。

WhenAll<TResult>(IEnumerable<Task<TResult>>)

列挙可能なコレクション内のすべての Task<TResult> オブジェクトが完了したときに完了するタスクを作成します。

WhenAll<TResult>(Task<TResult>[])

配列内のすべての Task<TResult> オブジェクトが完了したときに完了するタスクを作成します。

WhenAll(IEnumerable<Task>)

列挙可能なコレクション内のすべての Task オブジェクトが完了したときに完了するタスクを作成します。

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

パラメーター

tasks
IEnumerable<Task>

完了を待機するタスク。

戻り値

Task

指定されたすべてのタスクの完了を表すタスク。

例外

tasks 引数が null でした。

tasks コレクションに null タスクが含まれていました。

次の例では、配列内の 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()
                                Try
                                   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))
      Next
      Dim t As Task = Task.WhenAll(tasks)
      Try
         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

注釈

オブジェクトを返すメソッドのオーバーロードは、通常、一連のタスクの状態に関心がある場合、または一連のタスクによってスローされる例外で呼び出 WhenAll Task されます。

注意

メソッドの呼び WhenAll(IEnumerable<Task>) 出しによって、呼び出し元のスレッドがブロックされない。

指定されたタスクがエラー状態で完了した場合、返されたタスクも状態で完了します。この状態では、その例外には、指定された各タスクからのラップされていない例外のセットの集計が含まれます。 Faulted

指定されたタスクのいずれもエラーが発生したが、少なくとも 1 つが取り消された場合、返されたタスクは状態で終了 Canceled します。

どのタスクもエラーが発生しない場合、どのタスクも取り消された場合、結果のタスクは状態で終了 RanToCompletion します。

指定された配列/列挙可能にタスクが含まれている場合、返されたタスクは、呼び出し元に返される前にすぐに状態 RanToCompletion に遷移します。

適用対象

WhenAll(Task[])

配列内のすべての Task オブジェクトが完了したときに完了するタスクを作成します。

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

パラメーター

tasks
Task[]

完了を待機するタスク。

戻り値

Task

指定されたすべてのタスクの完了を表すタスク。

例外

tasks 引数が null でした。

tasks 配列に null タスクが含まれていました。

次の例では、配列内の 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()
                                Try
                                   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))
      Next
      Dim t As Task = Task.WhenAll(tasks.ToArray())
      Try
         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

注釈

オブジェクトを返すメソッドのオーバーロードは、通常、一連のタスクの状態に関心がある場合、または一連のタスクによってスローされる例外で呼び出 WhenAll Task されます。

注意

メソッドの呼び WhenAll(Task[]) 出しによって、呼び出し元のスレッドがブロックされない。

指定されたタスクがエラー状態で完了した場合、返されたタスクも状態で完了します。この状態では、その例外には、指定された各タスクからのラップされていない例外のセットの集計が含まれます。 Faulted

指定されたタスクのいずれもエラーが発生したが、少なくとも 1 つが取り消された場合、返されたタスクは状態で終了 Canceled します。

どのタスクもエラーが発生しない場合、どのタスクも取り消された場合、結果のタスクは状態で終了 RanToCompletion します。

指定された配列/列挙可能にタスクが含まれている場合、返されたタスクは、呼び出し元に返される前にすぐに状態 RanToCompletion に遷移します。

適用対象

WhenAll<TResult>(IEnumerable<Task<TResult>>)

列挙可能なコレクション内のすべての Task<TResult> オブジェクトが完了したときに完了するタスクを作成します。

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

完了したタスクの型。

パラメーター

tasks
IEnumerable<Task<TResult>>

完了を待機するタスク。

戻り値

Task<TResult[]>

指定されたすべてのタスクの完了を表すタスク。

例外

tasks 引数が null でした。

tasks コレクションに null タスクが含まれていました。

次の例では、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)
                               Next
                               Return total
                            End Function))
      Next
      Dim continuation = Task.WhenAll(tasks)
      Try
         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)
         Next
         Console.WriteLine()
         Console.WriteLine("Mean of Means: {0:N2}, n = 10,000",
                           grandTotal/10000)
      ' Display information on faulted tasks.
      Else 
         For Each t In tasks
            Console.WriteLine("Task {0}: {1}", t.Id, t.Status)
         Next
      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

指定されたタスクのいずれもエラーが発生したが、少なくとも 1 つが取り消された場合、返されたタスクは状態で終了 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 要素の配列になります。

適用対象

WhenAll<TResult>(Task<TResult>[])

配列内のすべての Task<TResult> オブジェクトが完了したときに完了するタスクを作成します。

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

完了したタスクの型。

パラメーター

tasks
Task<TResult>[]

完了を待機するタスク。

戻り値

Task<TResult[]>

指定されたすべてのタスクの完了を表すタスク。

例外

tasks 引数が null でした。

tasks 配列に null タスクが含まれていました。

次の例では、10 個のタスクを作成します。各タスクは、1 から 1,000 の間に 1,000 個の乱数を作成し、その平均値を計算する乱数ジェネレーターをインスタンス化します。 この場合、10 個の個々のタスクが配列に格納 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)
                                     Next
                                     Return total
                                  End Function)
      Next
      Dim continuation = Task.WhenAll(tasks)
      Try
         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)
         Next
         Console.WriteLine()
         Console.WriteLine("Mean of Means: {0:N2}, n = 10,000",
                           grandTotal/10000)
      ' Display information on faulted tasks.
      Else 
         For Each t In tasks
            Console.WriteLine("Task {0}: {1}", t.Id, t.Status)
         Next
      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

指定されたタスクのいずれもエラーが発生したが、少なくとも 1 つが取り消された場合、返されたタスクは状態で終了 Canceled します。

どのタスクもエラーが発生しない場合、どのタスクも取り消された場合、結果のタスクは状態で終了 RanToCompletion します。 返されるタスクの は、指定されたタスクのすべての結果を含む配列に設定されます(入力タスク配列に Result t1、t2、t3 が含まれている場合など)。出力タスクの は を返します Result TResult[] arr[0] == t1.Result, arr[1] == t2.Result, and arr[2] == t3.Result)

指定された配列/列挙可能にタスクが含まれている場合、返されたタスクは、呼び出し元に返される前にすぐに状態 RanToCompletion に遷移します。 返される は TResult[] 、0 要素の配列になります。

適用対象