2013-04-24 8 views
5

मैं कुछ वस्तुओं के प्रारंभिक रूप से अतुल्यकालिक चलाना चाहता हूं, लेकिन कुछ वस्तुएं दूसरों के प्रारंभ होने पर निर्भर करती हैं। और फिर मेरे बाकी आवेदन जारी होने से पहले सभी वस्तुओं को शुरू करने की आवश्यकता है।क्या आप एक कार्य पर कई बार प्रतीक्षा() कॉल कर सकते हैं?

क्या किसी कार्य पर प्रतीक्षा() को कॉल करना संभव है और बाद में इसे फिर से प्रतीक्षा करें (या मेरे उदाहरण WaitAll() में एक संग्रह पर जहां इसे शामिल किया गया है?

Dictionary<String, Task> taskdict = new Dictionary<String, Task>(); 

    taskdict.Add("Task1", 
     Task.Factory.StartNew(() => { 
     //Do stuff 
     })); 

    taskdict.Add("Task2", 
     Task.Factory.StartNew(() => { 
      taskdict[ "Task1" ].Wait(); 

     //Do stuff 

     })); 

     try { 
     Task.WaitAll(taskdict.Values.Convert<Task[ ]>()); 
     } 

या वह दूसरा इंतजार करेगा()/WaitAll() विफल हो जाएगा?

उत्तर

18

आप निश्चित रूप से एक कार्य पर दो बार इंतजार कर सकते हैं। आप किसी भी नकारात्मक साइड इफेक्ट्स के साथ जितनी बार चाहें उतनी बार काम पर इंतजार कर सकते हैं। अब, यदि आप पहले से ही उसी थ्रेड में किसी काम पर इंतजार कर चुके हैं, तो यह पहले से ही किया जाएगा, इसलिए भविष्य Wait कॉल सभी तुरंत इंतजार करेंगे क्योंकि प्रतीक्षा करने के लिए कुछ भी नहीं है, लेकिन वे निश्चित रूप से असफल नहीं होंगे या अन्यथा अनुचित नहीं होंगे परिणाम है।

ध्यान दें कि यदि कोई कार्य सामान्य रूप से पूरा नहीं होता है और इसके बजाय रद्द कर दिया गया था या अपवाद के परिणामस्वरूप समाप्त नहीं किया जा सका तो Wait को अपवाद दोबारा फेंक देगा (प्रत्येक बार जब आप Wait पर कॉल करेंगे)। यदि Wait आपके लिए अपवाद फेंक रहा है, तो यही कारण है कि यही कारण है।

+1

एक स्पष्ट उत्तर के लिए धन्यवाद। और अपवाद हैंडलिंग पर विस्तार के लिए। यह एक महत्वपूर्ण मुद्दा है जिस पर मुझे विचार करना चाहिए। –

+0

@ सर्विय अगर मैं चाहता हूं कि कार्य को फिर से चलाने के लिए, दूसरी प्रतीक्षा पर। मैं कार्य परिणाम को कैसे अमान्य कर सकता हूं? –

+0

@MerdanGochmuradov आप नहीं कर सकते। ऐसा नहीं है कि कार्य कैसे काम करते हैं। – Servy

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