2012-02-26 15 views
5

utilizo tarea paralela Biblioteca para iniciar algunas tareas, así:Tarea Parallel Library - sepa cuando todas las tareas están terminadas

public static void Main() 
    { 
     for (var i = 0; i < 10; i++) 
     { 
      var x = i; 
      Task.Factory.StartNew(() => new WorkerClass(x).Do()); 
     } 

     // (*) Here I'd like to wait for all tasks to finish 
     Task.WaitAll(); 

     Console.WriteLine("Ready."); 
     Console.ReadLine(); 
    } 

El problema es que algunas tareas pueden crear nuevas tareas en sí. Esta es la forma en WorkerClass parece:

public class WorkerClass 
{ 
    private static readonly NLog.Logger Log = NLog.LogManager.GetCurrentClassLogger(); 

    private readonly int _i; 

    public WorkerClass(int i) 
    { 
     _i = i; 
    } 

    public void Do() 
    { 
     if (_i % 3 == 0) 
      Task.Factory.StartNew(() => new WorkerClass(_i + 101).Do()); 

     Log.Info("Started {0}", _i); 
     Thread.Sleep(2000); 
     Log.Info("Done {0}", _i); 
    } 
} 

Por cada valor de i que es un múltiplo de 3, se inicia una nueva tarea.

Me gustaría ser capaz de esperar hasta que se hayan terminado todas las tareas (incluyendo las creadas por otras tareas).

¿Hay una manera limpia/incorporado para hacer esto (con o sin TPL)?

Respuesta

15

mantener una referencia a todas las tareas de nivel superior y luego sólo tiene que utilizar WaitAll:

var tasks = new Task[10]; 
    for (var i = 0; i < 10; i++) 
    { 
     var x = i; 
     tasks[i] = Task.Factory.StartNew(() => new WorkerClass(x).Do()); 
    } 

    Task.WaitAll(tasks); 

En cuanto a las tareas secundarias, sólo asegúrese de adjuntarlos a la tarea padre. Esto significa que la tarea padre no va a entrar en un estado completo hasta que también se acaban todas las tareas secundarias.

Task.Factory.StartNew(() => { }, TaskCreationOptions.AttachedToParent); 
+1

Gran! No sé cómo me he perdido la opción 'TaskCreationOptions.AttachedToParent' – GolfWolf

Cuestiones relacionadas