मैं एक ऐसी ही सवाल पूछा और अच्छा जवाब में से एक गुच्छा प्राप्त किया: Shutting down a multithreaded application
नोट: मेरे सवाल का एक सुंदर बाहर निकलने की जरूरत नहीं थी, लेकिन लोगों को अभी भी सिफारिश की है कि मैं शान से की पाश से बाहर निकलने के प्रत्येक धागा
Thread thread = new Thread(new ThreadStart(testObject.RunLoop));
thread.IsBackground = true;
thread.start();
पसंदीदा तरीका शुरू करने और धागे में है का प्रबंधन करने के:
मुख्य बात को याद है कि अगर आप से बचने के लिए चाहते हैं कि आपके धागे आप पृष्ठभूमि के लिए अपने सभी धागे स्थापित करना चाहिए समाप्त से अपनी प्रक्रिया को रोकने के है एक ThreadPool
, लेकिन किसी भी कंटेनर के बारे में सिर्फ आपके धागे का संदर्भ रखने के लिए उपयोग किया जा सकता है। आपके धागे हमेशा एक ध्वज होना चाहिए जो उन्हें समाप्त करने के लिए कहेंगे और उन्हें लगातार जांच करनी चाहिए।
इसके अलावा, बेहतर नियंत्रण के लिए आप CountdownLatch
के साथ अपने धागे की आपूर्ति कर सकते हैं: जब भी कोई थ्रेड अपने लूप से बाहर निकलता है तो यह CountdownLatch
पर संकेत देगा। आपका मुख्य धागा CountdownLatch.Wait()
विधि को कॉल करेगा और यह तब तक अवरुद्ध होगा जब तक कि सभी धागे सिग्नल नहीं हो जाते ... यह आपको ठीक से सफाई करने की अनुमति देता है और यह सुनिश्चित करता है कि सफाई शुरू करने से पहले आपके सभी थ्रेड बंद हो जाएं।
public class CountdownLatch
{
private int m_remain;
private EventWaitHandle m_event;
public CountdownLatch(int count)
{
Reset(count);
}
public void Reset(int count)
{
if (count < 0)
throw new ArgumentOutOfRangeException();
m_remain = count;
m_event = new ManualResetEvent(false);
if (m_remain == 0)
{
m_event.Set();
}
}
public void Signal()
{
// The last thread to signal also sets the event.
if (Interlocked.Decrement(ref m_remain) == 0)
m_event.Set();
}
public void Wait()
{
m_event.WaitOne();
}
}
यह भी है कि Thread.Abort() विधि कुछ अजीब काम करता है उल्लेख करने के लिए योग्य है:
एक धागा कॉल पर ही निरस्त करते हैं, प्रभाव एक अपवाद फेंकने के समान है; ThreadAbortException तुरंत होता है, और परिणाम अनुमानित है। हालांकि, अगर एक थ्रेड कॉल किसी अन्य थ्रेड पर निरस्त हो जाता है, तो निरंतर इंटरप्ट करता है जो भी चल रहा है। एक मौका भी है कि स्थैतिक कन्स्ट्रक्टर को निरस्त किया जा सकता है। दुर्लभ मामलों में, यह उस श्रेणी डोमेन में बनाए गए होने से उस वर्ग के उदाहरणों को रोक सकता है। में .NET Framework संस्करण 1.0 और 1.1, अंत में ब्लॉक चल रहा है, जबकि अंत में ब्लॉक निरस्त हो जाने पर थ्रेड समाप्त हो सकता है।
धागा कि कॉल बीच में बंद करें हो सकता है ब्लॉक अगर धागा कि निरस्त किया जा रहा है इस तरह के एक कैच ब्लॉक, अंत में ब्लॉक, या बाधित निष्पादन क्षेत्र के रूप में कोड, के एक संरक्षित क्षेत्र में है। अगर एबॉर्ट पर कॉल करने वाला थ्रेड एक लॉक रखता है जो निरस्त धागा आवश्यक है, तो एक डेडलॉक हो सकता है।
से बाहर निकल सकता है, मुझे शून्य थ्रेडएन्ट्री() पर एक प्रश्न मिला, एक बार जब हम थ्रेड शुरुआती बिंदु के मुख्य अनुप्रयोग में धागे का एक से अधिक बनाते हैं, तो हम लॉन्च कर सकते हैं आपके द्वारा निर्दिष्ट धागे की संख्या के अनुसार उस धागे पर कोई अन्य अनुप्रयोग। – shawn