2012-05-23 13 views
5

हैलो मेरे पास _noOfThreads एक समय में चलाने के लिए निर्धारित कार्यों के रूप में है। इसलिए मैं % ऑपरेटर का उपयोग करके कार्य जारी रखता हूं और लूप के अंत में मेरे पास Tasks.WaitAll है। यह कोड स्निपेट है।कार्य। प्रतीक्षा करें बच्चे के काम की प्रतीक्षा नहीं करता है?

for (int index = 0; index < count; index++) 
{ 

       if (index < _noOfThreads) 
        tasks[index] = Task.Factory.StartNew(somedelegate); 
       else 
        tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
          TaskContinuationOptions.AttachedToParent); 
} 
    Task.WaitAll(tasks); 

हालांकि, मुझे लगता है कि यह बाल कार्यों को पूरा करने की प्रतीक्षा नहीं करता है। जैसे ही मूल कार्य पूर्ण हो जाते हैं, Task.WaitAll के बाद अगली पंक्ति निष्पादित हो जाती है। बाल कार्यों के इंतजार के लिए मैं इस कोड को कैसे बदलूं?

+0

की [Task.ContinueWith काम नहीं कर रहा है कि कैसे उम्मीद] (http://stackoverflow.com/questions/6997480/task-continuewith-not-working-how-i-expected) – mellamokb

+0

एक तरफ ध्यान दें पर संभव डुप्लिकेट, क्या आप यहां कार्य शेड्यूलिंग का निर्णय ले रहे हैं। यदि आप शेड्यूलिंग को कस्टमाइज़ करना चाहते हैं, तो आप [टास्कशेड्यूलर] (http://msdn.microsoft.com/en-us/library/system.threading.tasks.taskscheduler.aspx) से प्राप्त करने पर विचार कर सकते हैं। उस ने कहा, डिफ़ॉल्ट शेड्यूलर पहले से ही थ्रेड के साथ सिस्टम को ओवरलोड नहीं करने का एक बहुत अच्छा काम करता है जब बड़ी संख्या में कार्यों को कतारबद्ध किया जाता है। –

+0

@ डैन: यह मेरी चिंता नहीं है। मुझे नहीं पता कि यह टास्कशेड्यूलर को देना चाहता है। मेरे पास एक चर है और मैं केवल उस चर के रूप में कार्य शुरू करना चाहता हूं। संक्षेप में, मैं सेमाफोर जैसे कुछ अनुकरण करना चाहता हूं जहां आप धागे की संख्या को परिभाषित करते हैं और केवल उस संख्या के धागे कोड के उस टुकड़े को निश्चित समय पर दर्ज कर सकते हैं। –

उत्तर

8

मुझे लगता है कि आप के रूप में अपने कार्य का आवंटन किया गया है:

Tasks[] tasks = new Task[ _noOfThreads]; 

होने के लिए अपने कोड में परिवर्तित करें:

Tasks[] tasks = new Task[count]; 

for (int index = 0; index < count; index++) 
{ 

    if (index < _noOfThreads) 
     tasks[index] = Task.Factory.StartNew(somedelegate); 
    else 
     tasks[index] = tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
          TaskContinuationOptions.AttachedToParent); 
} 
Task.WaitAll(tasks); 

एक बार इसे आज़माएं! शुभकामनाएँ :)

3

आप केवल मूल कार्य के लिए प्रतीक्षा कर रहे हैं। सभी निरंतरताओं को पूरा करने के लिए प्रतीक्षा करने के लिए, आपको निरंतर कार्यों पर WaitAll पर कॉल करने की आवश्यकता है। सरल तरीका यह है, ताकि आप केवल अंतिम निरंतरता पर इंतजार कर रहे हैं मूल चर करने के लिए वापस प्रत्येक निरंतरता कार्य पुन: असाइन करने होगा:

else 
    tasks[index % _noOfThreads] = 
     tasks[index % _noOfThreads].ContinueWith(task => { foo.bar(); }, 
         TaskContinuationOptions.AttachedToParent); 

भी देखें this related question

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