[C#] Ejecutar varias tareas asíncronas y esperar a que se completen todas


Answers

Podrías crear muchas tareas como:

List<Task> TaskList = new List<Task>();
foreach(...)
{
   var LastTask = new Task(SomeFunction);
   LastTask.Start();
   TaskList.Add(LastTask);
}

Task.WaitAll(TaskList.ToArray());
Question

Necesito ejecutar varias tareas asíncronas en una aplicación de consola y esperar a que se completen todas antes de continuar el proceso.

Hay muchos artículos por ahí, pero parece que estoy más confundido cuanto más leo. He leído y entiendo los principios básicos de la biblioteca de tareas, pero claramente me falta un enlace en alguna parte.

Entiendo que es posible encadenar tareas para que comiencen después de que se complete otra (que es prácticamente el escenario para todos los artículos que he leído), pero quiero que todas mis tareas se ejecuten al mismo tiempo, y quiero saber una vez todos están completos.

¿Cuál es la implementación más simple para un escenario como este?




Así es como lo hago con una matriz Func <> :

var tasks = new Func<Task>[]
{
   () => myAsyncWork1(),
   () => myAsyncWork2(),
   () => myAsyncWork3()
};

await Task.WhenAll(tasks.Select(task => task()).ToArray()); //Async    
Task.WaitAll(tasks.Select(task => task()).ToArray()); //Or use WaitAll for Sync



¿Desea encadenar las Task , o pueden invocarse de forma paralela?

Para encadenar
Solo haz algo como

Task.Run(...).ContinueWith(...).ContinueWith(...).ContinueWith(...);
Task.Factory.StartNew(...).ContinueWith(...).ContinueWith(...).ContinueWith(...);

y no olvide verificar la instancia de la Task anterior en cada ContinueWith ya que podría tener una falla.

Para la forma paralela
El método más simple que encontré: Parallel.Invoke De lo contrario, hay Task.WaitAll o incluso puedes usar WaitHandle s para hacer una cuenta atrás para poner en cero las acciones restantes (espera, hay una nueva clase: CountdownEvent ), o ...