2012-02-26 119 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

相關問題