2012-06-13 3 views
11

मैं सी # में एक थ्रेड का उपयोग कर रहा हूं जहां मैंने IsBackground प्रॉपर्टी को सत्य पर सेट किया है। जब तक एप्लिकेशन बंद नहीं हो जाता तब तक थ्रेड लूप में कुछ कोड चला रहा है। जब एप्लिकेशन बंद हो जाता है तो धागा निष्पादन बंद कर देता है (क्योंकि मैंने IsBackground = true सेट किया है)।क्या मैं पता लगा सकता हूं कि आवेदन बंद होने पर एप्लिकेशन द्वारा पृष्ठभूमि थ्रेड की हत्या कब की जाती है?

एप्लिकेशन थ्रेड को कैसे मारता है? ऐसा लगता है कि यह गर्भपात कहकर ऐसा नहीं करता है क्योंकि मुझे थ्रेडएबॉर्ट अपवाद नहीं मिलता है। क्या यह दृश्यों के पीछे होता है? मैं लूप के आखिरकार ब्लॉक में कुछ रोलबैक करना चाहता हूं।

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

+0

आप इसे अग्रभूमि धागा बना सकते हैं और 'ग्लोबल' एप्लिकेशन शटडाउन परिदृश्य बना सकते हैं जो मैन्युअल रूप से थ्रेड को बंद कर देता है। – CodingBarfield

+0

क्या आपने [AppDomain.ProcessExit] (http://msdn.microsoft.com/en-us/library/system.appdomain.processexit.aspx) ईवेंट देखा है? – Botz3000

+0

तो आप दोनों कह रहे हैं कि यह दृश्यों के पीछे होता है और मैं इस तरह के कस्टम समाधान बनाने के अलावा अन्य पर प्रतिक्रिया नहीं दे सकता? –

उत्तर

5

ऐसा लगता है कि यह गर्भपात क्योंकि मैं एक ThreadAbortException

यह करता है नहीं मिलता है फोन करके यह काम नहीं करता, CLR एक धागा निरस्त करने के लिए दो तरीके हैं। "सामान्य" तरीका, Thread.Abort() के माध्यम से बुलाया गया, थ्रेड थ्रेडएबॉर्ट अपवाद देख सकता है। लेकिन एक कठोर गर्भपात भी है, वैसे ही काम करता है। लेकिन टीएई को घटाएं और अंततः निष्पादित नहीं किया जाएगा। आप इसे देख नहीं सकते।

+0

आह .. इसे सॉर्ट करने के लिए धन्यवाद। मुझे इस –

+0

पर कोई दस्तावेज नहीं मिला है क्या यह एमएसडीएन पर गलती है? http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception।एएसपीएक्स जब एक प्रबंधित निष्पादन योग्य में सभी अग्रभूमि धागे समाप्त होने के बाद सामान्य भाषा रनटाइम (सीएलआर) पृष्ठभूमि थ्रेड बंद कर देता है, तो यह थ्रेड.एबॉर्ट का उपयोग नहीं करता है। इसलिए, आप CLreadAbortException का उपयोग यह पता लगाने के लिए नहीं कर सकते कि सीएलआर द्वारा पृष्ठभूमि धागे को कब समाप्त किया जा रहा है। – Eldar

+0

मुझे उस एमएसडीएन आलेख और इस उत्तर के बीच कोई विसंगति दिखाई नहीं दे रही है। अशिष्ट बंदरगाहों को आवेदन कोड द्वारा ट्रिगर किया जा सकता है लेकिन आपको AppDomain.Unload या Environment.Exit की आवश्यकता होगी, आमतौर पर उन तरीकों की तरह नहीं जो किसी को थ्रेड को रोकने के तरीके के रूप में पहले सोचते हैं :) –

1

प्रारंभ thread चल रहा स्थिति (यानी, निष्पादन शुरू होता है) में प्रवेश करता है जब ऑपरेटिंग सिस्टम thread पर एक प्रोसेसर निर्दिष्ट करता है। जब स्टार्टेड थ्रेड पहली बार प्रोसेसर प्राप्त करता है और रनिंग थ्रेड बन जाता है, तो थ्रेड अपने ThreadStart delegate निष्पादित करता है, जो थ्रेड अपने जीवनकाल के दौरान किए जाने वाले कार्यों को निर्दिष्ट करता है। जब कोई प्रोग्राम एक नया थ्रेड बनाता है, तो प्रोग्राम थ्रेड कन्स्ट्रक्टर के तर्क के रूप में थ्रेड के ThreadStart delegate को निर्दिष्ट करता है।

एक रनिंग थ्रेड Stopped (or Dead) स्थिति में प्रवेश करता है जब इसकी ThreadStart delegate समाप्त हो जाती है। आपके मामले में आपका मुख्य धागा समाप्त हो जाता है। तो, आपकी ThreadStart delegate ऑब्जेक्ट स्मृति में नहीं रहती है। जब थ्रेड ऑब्जेक्ट का कोई संदर्भ नहीं होता है, तो कचरा कलेक्टर थ्रेड ऑब्जेक्ट को स्मृति से हटा सकता है।

+0

इस के एक अच्छे स्पष्टीकरण के लिए धन्यवाद। मैं AppDomain.ProcessExit ईवेंट का उपयोग कर समाप्त हुआ क्योंकि Botz3000 ने सुझाव दिया था। मैं तब थ्रेड कॉल कर सकता हूं। एबॉर्ट() जब यह घटना उठाई जाती है। ऐसा लगता है कि यह अच्छा काम कर रहा है। –

+0

यह उत्तर गलत है। एक संग्रहित पृष्ठभूमि धागा जीसी द्वारा इसे एकत्रित नहीं किया जाता है। यह आपके द्वारा प्रबंधित थ्रेड ऑब्जेक्ट के मजबूत संदर्भों के बावजूद रनटाइम द्वारा बलपूर्वक निरस्त किया जाता है। स्पष्टीकरण के लिए हंस का जवाब देखें। – Josh

+0

@ जोशइंस्टीन: हो सकता है कि आप सही हों, लेकिन हंस ने समझाया नहीं कि सीएलआर असामान्य रूप से धागे को कैसे रोकता है .... क्या आप समझा सकते हैं? – Talha

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

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