whenall waitall example c# .net multithreading c#-4.0 task-parallel-library

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 .