whenall - task waitall example c#
Task.WaitAll no espera a la tarea hijo? (2)
Hola, tengo _noOfThreads
como tareas definidas para ejecutar a la vez. Así que continúo con las tareas usando el operador %
y al final del ciclo tengo Tasks.WaitAll
. Este es el fragmento de código.
for (int index = 0; index < count; index++)
{
if (index < _noOfThreads)
tasks[index] = Task.Factory.StartNew(somedelegate);
else
tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); },
TaskContinuationOptions.AttachedToParent);
}
Task.WaitAll(tasks);
Sin embargo, me doy cuenta de que no espera a que se completen las tareas secundarias. Tan pronto como se completen las tareas principales, se ejecutará la siguiente línea después de Task.WaitAll
. ¿Cómo cambio este código para esperar también las tareas secundarias?
Creo que estás asignando tus tareas como:
Tasks[] tasks = new Task[ _noOfThreads];
Cambie su código para ser:
Tasks[] tasks = new Task[count];
for (int index = 0; index < count; index++)
{
if (index < _noOfThreads)
tasks[index] = Task.Factory.StartNew(somedelegate);
else
tasks[index] = tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); },
TaskContinuationOptions.AttachedToParent);
}
Task.WaitAll(tasks);
¡Darle una oportunidad! Buena suerte :)
Usted está esperando solo la tarea original. Para esperar a que se completen todas las continuación, debe llamar a WaitAll
en las tareas de continuación. Una forma simple de lograr esto sería volver a asignar cada tarea de continuación a la variable original, de modo que solo esté esperando las siguientes:
else
tasks[index % _noOfThreads] =
tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); },
TaskContinuationOptions.AttachedToParent);
Ver también esta pregunta relacionada .