2012-05-23 12 views
5

Hola tengo _noOfThreads como tareas definidas para ejecutar a la vez. Así que sigo continuando las tareas usando el operador % y al final del ciclo tengo Tasks.WaitAll. Este es el fragmento de código.Task.WaitAll no espera la tarea secundaria?

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, veo 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?

+0

posible duplicado de [Tarea.ContinuarWith no funciona como esperaba] (http://stackoverflow.com/questions/6997480/task-continuewith-not-working-how-i-expected) – mellamokb

+0

En una nota lateral, ¿qué parece que hacer aquí es decidir la programación de tareas. Si desea personalizar la programación, puede ver derivada de [TaskScheduler] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.aspx). Dicho esto, el programador predeterminado ya hace un buen trabajo al no sobrecargar el sistema con subprocesos cuando hay una gran cantidad de tareas en cola. –

+0

@Dan: Esa no es mi preocupación. No sé si quiero darle esto a TaskScheduler. Tengo una variable y quiero iniciar Tareas tantas como esa variable solamente. En resumen, quiero simular algo parecido a Semaphore, donde se define el número de subprocesos y solo esa cantidad de subprocesos puede ingresar a ese trozo de código en un momento determinado. –

Respuesta

8

creo que se están asignando sus tareas como:

Tasks[] tasks = new Task[ _noOfThreads]; 

cambiar el 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 :)

3

Usted está esperando solamente la tarea original. Para esperar a que se completen todas las continuación, debe llamar al WaitAll en las tareas de continuación. Una manera sencilla de lograr esto sería volver a asignar cada tarea de continuación de nuevo a la variable original, de modo que usted está esperando sólo en las continuaciones finales:

else 
    tasks[index % _noOfThreads] = 
     tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
         TaskContinuationOptions.AttachedToParent); 

Ver también this related question.

Cuestiones relacionadas