2008-08-09 16 views
8

मेरे पास .NET CF 2.0:जारी रखने से पहले थ्रेड के लिए कैसे इंतजार करें?

ThreadStart tStart = new ThreadStart(MyMethod); 
Thread t = new Thread(tStart); 
t.Start(); 

पर धागा शुरू करने के लिए कुछ कोड है यदि मैं इसे लूप के अंदर कॉल करता हूं तो आइटम ऑर्डर से बाहर हो जाते हैं। Xzx10 के बाद प्रतीक्षा कैसे करें, ताकि थ्रेड पर काम कोड जारी होने से पहले पूरा हो जाए? मैन्युअल रूप से धागे बनाने से शुरू करने के लिए BeginInvoke/EndInvoke बेहतर विकल्प होगा?

उत्तर

9

कितना आपको धागे पर लागू करने के लिए की जरूरत है? यदि कोड जारी रखने से पहले आपको लूप में शुरू होने वाले सभी कामों की आवश्यकता है, लेकिन आपको लूप के भीतर काम के आदेश की परवाह नहीं है, तो कॉलिंग का जवाब उत्तर है। Kevin Kenny's answer, पर अधिक जानकारी जोड़ने के लिए आपको लूप के बाहर शामिल होना चाहिए। इसका मतलब है आप एक संग्रह की आवश्यकता होगी धागे आप शुरू के लिए संदर्भ धारण करने के लिए:

// Start all of the threads. 
List<Thread> startedThreads = new List<Thread>(); 
foreach (...) { 
    Thread thread = new Thread(new ThreadStart(MyMethod)); 
    thread.Start(); 
    startedThreads.Add(thread); 
} 

// Wait for all of the threads to finish. 
foreach (Thread thread in startedThreads) { 
    thread.Join(); 
} 

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

यदि व्यक्तिगत धागे कुछ परिणाम उत्पन्न करते हैं (उदाहरण के लिए लॉग में एक संदेश लिखें) तो संदेश अभी भी आदेश से बाहर दिखाई दे सकते हैं क्योंकि धागे के बीच कोई समन्वय नहीं है। मॉनिटर के साथ समन्वय करके धागे को अपने परिणामों को आउटपुट करना संभव है।

2

यदि मैं इसे ठीक से पढ़ रहा हूं, तो आप थ्रेड के गुच्छा पर काम आइटम शुरू कर रहे हैं, लेकिन आप चिंतित हैं कि धागे क्रम से बाहर हो रहे हैं, और, जब तक प्रत्येक थ्रेड ऑर्डर में पूरा नहीं हो जाता तब तक प्रतीक्षा करना पसंद करेंगे शुरू किया गया था?

यदि ऐसा है तो मुझे यकीन नहीं है कि आप प्रति कार्य आइटम क्यों थ्रेड बना रहे हैं। शायद आप विस्तार कर सकते हैं?

आप पूरा करने के लिए एक धागा के लिए प्रतीक्षा करने की जरूरत थी, तो तुम सिर्फ कर सकता है:

t.Join(); 
4

धागे को खत्म करने की प्रतीक्षा करने का एक और तरीका AutoResetEvent का उपयोग कर रहा है।

private readonly AutoResetEvent mWaitForThread = new AutoResetEvent(false); 

private void Blah() 
{ 
    ThreadStart tStart = new ThreadStart(MyMethod); 
    Thread t = new Thread(tStart); 
    t.Start(); 

    //... (any other things) 
    mWaitForThread.WaitOne(); 
} 

private void MyMethod() 
{ 
    //... (execute any other action) 
    mWaitForThread.Set(); 
} 
संबंधित मुद्दे