Este artículo se tradujo automáticamente. Para ver el artículo en inglés, active la casilla Inglés. Además, puede mostrar el texto en inglés en una ventana emergente si mueve el puntero del mouse sobre el texto.
Traducción
Inglés

Método Task.WhenAll<TResult>(Task<TResult>[])

.NET Framework (current version)
 

Publicado: octubre de 2016

Crea una tarea que se completará cuando todos los objetos Task<TResult> de una matriz se hayan completado.

Espacio de nombres:   System.Threading.Tasks
Ensamblado:  mscorlib (en mscorlib.dll)

public static Task<TResult[]> WhenAll<TResult>(
	params Task<TResult>[] tasks
)

Parámetros

tasks
Type: System.Threading.Tasks.Task<TResult>[]

Tareas cuya finalización hay que esperar.

Valor devuelto

Type: System.Threading.Tasks.Task<TResult[]>

Tarea que representa la finalización de todas las tareas proporcionadas.

Parámetros de tipo

TResult

Tipo de la tarea completada.

Exception Condition
ArgumentNullException

El argumento tasks era null.

ArgumentException

La matriz tasks contenía una tarea null.

La llamada a WhenAll<TResult>(Task<TResult>[]) método no bloquea el subproceso de llamada. Sin embargo, una llamada a devuelto Result propiedad bloquear el subproceso que realiza la llamada.

Si cualquiera de las tareas proporcionadas se completa en un estado de error, la tarea devuelta también se completará en un TaskStatus.Faulted estado, donde sus excepciones contendrá la agregación del conjunto de excepciones sin ajustar de cada una de las tareas proporcionadas.

Si ninguna de las tareas proporcionadas con errores, pero al menos uno de ellos se ha cancelado, la tarea devuelta finalizará en el TaskStatus.Canceled estado.

Si ninguna de las tareas con errores y ninguna de las tareas se han cancelado, la tarea resultante finalizará en el TaskStatus.RanToCompletion estado. El Result de la tarea devuelta se establecerá en una matriz que contiene todos los resultados de las tareas proporcionadas en el mismo orden como se le proporcionaron (por ejemplo, si la entrada tareas matriz contenida t1, t2, t3, la tarea de salida Result devolverá un TResult[] donde arr[0] == t1.Result, arr[1] == t2.Result, and arr[2] == t3.Result).

Si el proporcionado matriz/enumerable no contiene tareas, la tarea devuelta cambiará inmediatamente a un TaskStatus.RanToCompletion de estado antes de que se devuelve al llamador. El valor devuelto TResult[] será una matriz de elementos de 0.

En el ejemplo siguiente se crea diez tareas, cada uno de los cuales crea un generador de números aleatorios que crea 1.000 números aleatorios entre 1 y 1.000 y calcula la Media. En este caso, las diez tareas individuales se almacenan en un Task<Int64> matriz. El Delay(Int32) método se usa para retrasar la creación de instancias de los generadores de números aleatorios para que no se crean con valores de inicialización idénticos. La llamada a la WhenAll<TResult> método devuelve un Int64 matriz que contiene el promedio calculado por cada tarea. A continuación, estos se utilizan para calcular la media general.

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

Plataforma universal de Windows
Disponible desde 8
.NET Framework
Disponible desde 4.5
Biblioteca de clases portable
Se admite en: plataformas portátiles de .NET
Windows Phone Silverlight
Disponible desde 8.0
Windows Phone
Disponible desde 8.1
Volver al principio
Mostrar: