2013-06-10 13 views
7

यहाँ पूरा हो गया है जब हम Task.Factory.StartNew() का उपयोग कर तो हम .ContinueWith() ब्लॉक का उपयोग करते हैं प्रत्येक कार्य खत्म निर्धारित करने के लिए कर सकते हैं एक से अधिक कार्य शुरू से अधिक कार्यकैसे जब सभी कार्य

Task.Factory.StartNew(() => 
     { 
      //foreach (KeyValuePair<string, string> entry in dicList) 

      Parallel.ForEach(dicList, 
       entry => 
       { 

        //create and add the Progress in UI thread 
        var ucProgress = (Progress)fpPanel.Invoke(createProgress, entry); 

        //execute ucProgress.Process(); in non-UI thread in parallel. 
        //the .Process(); must update UI by using *Invoke 
        ucProgress.Process(); 

        System.Threading.Thread.SpinWait(5000000); 
       }); 
     }); 
.ContinueWith(task => 
    { 
     //to handle exceptions use task.Exception member 

     var progressBar = (ProgressBar)task.AsyncState; 
     if (!task.IsCancelled) 
     { 
      //hide progress bar here and reset pb.Value = 0 
     } 
    }, 
    TaskScheduler.FromCurrentSynchronizationContext() //update UI from UI thread 
); 

शुरू करने के लिए नमूना कोड है निर्धारित करने के लिए। मेरा मतलब है कि प्रत्येक कार्य पूरा करने के लिए एक बार ब्लॉक आग के साथ जारी रखें। तो मैं सिर्फ यह जानना चाहता हूं कि टीपीएल पुस्तकालय में कोई तंत्र है। अगर मैं Task.Factory.StartNew() का उपयोग करके 10 कार्य शुरू करता हूं तो 10 कार्य समाप्त होने के बाद मैं कैसे सूचित करूं। कृपया नमूना कोड के साथ कुछ अंतर्दृष्टि दें।

+0

क्या उन्हें एक के बाद एक चलाने की जरूरत है? – Mez

उत्तर

19

अगर मैं 10 Task.Factory.StartNew() का उपयोग कर कार्य प्रारंभ करें तो मैं कैसे के बाद जब 10 कार्य किया जाएगा सूचित करते खत्म

तीन विकल्प:

  • अवरुद्ध Task.WaitAll कॉल , जो केवल तभी लौटाता है जब सभी दिए गए कार्यों को
  • एसिंक Task.WhenAll कॉल, जो एक कार्य देता है जो सभी दिए गए कार्यों को पूरा करता है। (.NET 4.5 में प्रस्तुत किया गया।)
  • TaskFactory.ContinueWhenAll, जो एक निरंतर कार्य जोड़ता है जो सभी दिए गए कार्यों को पूरा करते समय चलाएगा।
+3

'टास्क फैक्ट्री। कंटिन्यूहेनएल (...) 'यदि आप 4.0 तक सीमित हैं तो भी आसान है। –

+2

@ किरिलशलेन्स्की: ओह, अच्छा - याद आया कि, इसे जोड़ देगा। –

+0

मैं नेट संस्करण 4.0 में काम कर रहा हूं। मैं 10 कार्य शुरू करना चाहता हूं और मैं प्रत्येक कार्य पूरा होने पर अधिसूचित होना चाहता हूं और 10 कार्य पूरा होने पर भी एक अंतिम अधिसूचना आनी चाहिए। कृपया मुझे विचार दें। धन्यवाद – Thomas

1

आप WaitAll() का उपयोग कर सकते हैं। उदाहरण:

Func<bool> DummyMethod =() =>{ 
    // When ready, send back complete! 
    return true; 
}; 

// Create list of tasks 
System.Threading.Tasks.Task<bool>[] tasks = new System.Threading.Tasks.Task<bool>[2]; 

// First task 
var firstTask = System.Threading.Tasks.Task.Factory.StartNew(() => DummyMethod(), TaskCreationOptions.LongRunning); 
tasks[0] = firstTask; 

// Second task 
var secondTask = System.Threading.Tasks.Task.Factory.StartNew(() => DummyMethod(), TaskCreationOptions.LongRunning); 
tasks[1] = secondTask; 

// Launch all 
System.Threading.Tasks.Task.WaitAll(tasks); 
+0

"<" and the ">" प्रकट नहीं हुआ। यहां कोशिश कर रहा है: Func DummyMethod =() => { // तैयार होने पर, पूर्ण वापस भेजें! सच वापसी; }; – Mez

+1

मुझे लगता है कि "सभी लॉन्च करें" टिप्पणी काफी उलझन में है, क्योंकि 'WaitAll()' वास्तव में कुछ भी लॉन्च नहीं करता है। – svick

+0

मैं नेट संस्करण 4.0 में काम कर रहा हूं। मैं 10 कार्य शुरू करना चाहता हूं और मैं प्रत्येक कार्य पूरा होने पर अधिसूचित होना चाहता हूं और 10 कार्य पूरा होने पर भी एक अंतिम अधिसूचना आनी चाहिए। कृपया मुझे विचार दें। धन्यवाद – Thomas

1

अगर मैं शुरू 10 Task.Factory.StartNew का उपयोग कर कार्य() तो मैं कैसे सूचित करने के बाद जब 10 कार्य हो जाएगा खत्म

आप Task.WaitAll का उपयोग कर सकते है। यह कॉल मौजूदा थ्रेड को तब तक अवरुद्ध कर देगा जब तक कि सभी कार्य समाप्त नहीं हो जाते।

साइड नोट: आप Task, Parallel और Thread.SpinWait का उपयोग कर रहे हैं, जो आपके कोड को जटिल बनाता है। अगर मैं जटिलता वास्तव में जरूरी है तो मैं थोड़ा सा समय विश्लेषण करूँगा।

+0

मैं नेट संस्करण 4.0 में काम कर रहा हूं। मैं 10 कार्य शुरू करना चाहता हूं और मैं प्रत्येक कार्य पूरा होने पर अधिसूचित होना चाहता हूं और 10 कार्य पूरा होने पर भी एक अंतिम अधिसूचना आनी चाहिए। कृपया मुझे विचार दें। धन्यवाद – Thomas

+0

@ थॉमस मैं जॉब पूरा करने पर अधिसूचना भेजने के लिए प्रत्येक कार्य में 'कॉन्टिन्यू विथ' जोड़ूंगा और अंतिम पंक्ति 'टास्क .aitएल() 'होगी। दूसरे शब्दों में, प्रत्येक कार्य कार्य श्रृंखला का उपयोग करके समाप्त होने पर अधिसूचना प्रदान करता है, जहां जंजीर कार्य केवल पूरा होने पर रिपोर्ट करता है। 'टास्क। वैटएल' विधि के लिए भी एक कॉल होगा - यह आपको सभी कार्यों के काम पूरा होने के बारे में अधिसूचना देने की अनुमति देगा। सही बात? – oleksii

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