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

समस्या यह है कि कुछ कार्यों नए कार्य के लिए खुद बना सकते हैं।

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

3 की एक बहु है कि i के हर मूल्य के लिए, एक नया कार्य शुरू कर दिया गया है: यह कैसे WorkerClass लग रहा है की तरह है।

मैं सभी कार्यों (अन्य कार्यों द्वारा बनाए गए समेत) तक प्रतीक्षा करने में सक्षम होना चाहता हूं।

क्या ऐसा करने के लिए एक साफ/अंतर्निहित तरीका है (टीपीएल के साथ या बिना)?

उत्तर

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

संबंधित मुद्दे