2012-02-26 88 views
5

我使用任务并行库启动一些任务,比如:任务并行库 - 知道当所有任务完成后

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(); 
    } 

的问题是,有些任务可以创建新的任务本身。这是怎么WorkerClass样子:

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); 
    } 
} 

对于i每个值是3的倍数,新的任务开始。

我希望能够等到所有任务(包括由其他任务创建的任务)完成。

是否有干净/内置的方式来做到这一点(有或没有TPL)?

回答

15

保持对它的引用所有顶层的任务,然后只用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); 

至于孩子的任务,只要确保你将它们连接到父任务。这意味着在所有子任务也完成之前,父任务不会进入完整状态。

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

太好了!我不知道我错过了什么'TaskCreationOptions.AttachedToParent'选项 – GolfWolf 2012-02-26 09:09:49

相关问题