c# Ejecutar varias tareas asíncronas y esperar a que se completen todas



3 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());
c# .net asynchronous task-parallel-library async-await

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?




¿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 ...




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



Related