2012-02-26 27 views
5

tôi sử dụng Task Song song Library để bắt đầu một số nhiệm vụ, như vậy:công tác song song Thư viện - Biết khi nào tất cả các nhiệm vụ được hoàn thành

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

Vấn đề là một số nhiệm vụ có thể tạo ra nhiệm vụ mới bản thân. Đây là cách WorkerClass trông giống như:

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 với mỗi giá trị của i đó là một bội số của 3, một công tác mới được bắt đầu.

Tôi muốn có thể đợi cho đến khi tất cả các tác vụ (bao gồm cả các tác vụ được tạo bởi các tác vụ khác) được hoàn thành.

Có cách nào sạch sẽ/tích hợp để thực hiện việc này (có hoặc không có TPL) không?

Trả lời

15

Giữ một tài liệu tham khảo cho tất cả các nhiệm vụ cấp cao nhất và sau đó chỉ cần sử dụng 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); 

Đối với nhiệm vụ trẻ em, chỉ cần đảm bảo bạn đính kèm chúng vào các nhiệm vụ phụ huynh. Điều này có nghĩa rằng nhiệm vụ phụ huynh sẽ không đi vào trạng thái hoàn chỉnh cho đến khi tất cả các nhiệm vụ con cũng được hoàn thành.

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

Tuyệt vời! Tôi không biết làm thế nào tôi đã bỏ lỡ tùy chọn 'TaskCreationOptions.AttachedToParent' – GolfWolf

Các vấn đề liên quan