MSDN में, थ्रेड.एबोर्ट () विधि का वर्णन कहता है: "इस विधि को कॉल करने से आमतौर पर थ्रेड समाप्त हो जाता है।"
हमेशा क्यों नहीं?
किन मामलों में यह धागे को समाप्त नहीं करता है?
क्या धागे समाप्त करने की कोई अन्य संभावना है?
MSDN में, थ्रेड.एबोर्ट () विधि का वर्णन कहता है: "इस विधि को कॉल करने से आमतौर पर थ्रेड समाप्त हो जाता है।"
हमेशा क्यों नहीं?
किन मामलों में यह धागे को समाप्त नहीं करता है?
क्या धागे समाप्त करने की कोई अन्य संभावना है?
जवाबों:
Thread.Abort()ThreadAbortExceptionधागे पर इंजेक्शन लगाता है । थ्रेड कॉल करके अनुरोध को रद्द कर सकता है Thread.ResetAbort()। इसके अलावा, कुछ निश्चित कोड भाग हैं, जैसे कि finallyब्लॉक जो अपवाद को संभालने से पहले निष्पादित करेगा। यदि किसी कारण से थ्रेड ऐसे ब्लॉक में फंस गया है तो अपवाद कभी भी थ्रेड पर नहीं उठाया जाएगा।
चूंकि कॉल करते समय थ्रेड की स्थिति पर कॉलर का बहुत कम नियंत्रण होता है Abort(), इसलिए आमतौर पर ऐसा करना उचित नहीं होता है। इसके बजाय समाप्ति का अनुरोध करने वाले थ्रेड को संदेश भेजें।
किन मामलों में यह धागे को समाप्त नहीं करता है?
यह प्रश्न एक डुप्लिकेट है।
Thread.Abort () का उपयोग करने में क्या गलत है
क्या धागे को समाप्त करने के लिए कोई अन्य सकारात्मकता है?
हाँ। आपकी समस्या यह है कि आपको कभी भी एक ऐसा सूत्र शुरू नहीं करना चाहिए जिसे आप विनम्रतापूर्वक रोक नहीं सकते, और यह समय पर रुक जाता है। यदि आप ऐसी स्थिति में हैं, जहां आपको एक ऐसा धागा शुरू करना है, जिसे रोकना मुश्किल (1) हो सकता है, (2) छोटी गाड़ी, या सबसे खराब (3) उपयोगकर्ता के लिए शत्रुतापूर्ण है, तो सही काम करना है एक नई प्रक्रिया, नई प्रक्रिया में थ्रेड प्रारंभ करें, और फिर जब आप थ्रेड को नीचे जाने के लिए प्रक्रिया को समाप्त करें । केवल एक चीज जो अनकॉपरेटिव थ्रेड की सुरक्षित समाप्ति की गारंटी दे सकती है, वह है ऑपरेटिंग सिस्टम इसकी पूरी प्रक्रिया को ले रहा है।
अधिक विवरण के लिए इस प्रश्न का मेरा अत्यधिक लंबा उत्तर देखें:
C # में लूप के भीतर लॉक स्टेटमेंट का उपयोग करना
संबंधित बिट अंत में थोड़ा सा है जहां मैं चर्चा करता हूं कि क्या विचार हैं कि आप कितने समय तक थ्रेड का इंतजार करते हैं, इससे पहले कि आप इसे गर्भपात कर लें।
हमेशा क्यों नहीं? किन मामलों में यह धागे को समाप्त नहीं करता है?
शुरुआत के लिए, एक धागा एक पकड़ सकता है ThreadAbortExceptionऔर अपनी समाप्ति को रद्द कर सकता है। या यह एक गणना कर सकता है जो हमेशा के लिए होता है जबकि आप इसे गर्भपात करने की कोशिश कर रहे हैं। इस वजह से, रनटाइम इस बात की गारंटी नहीं दे सकता कि आपके पूछने के बाद धागा हमेशा समाप्त हो जाएगा।
ThreadAbortException ज्यादा है:
जब थ्रेड को नष्ट करने के लिए एबॉर्ट विधि से कॉल किया जाता है, तो सामान्य भाषा रनटाइम एक थ्रेडबोर्टएक्ससेप्शन फेंकता है। ThreadAbortException एक विशेष अपवाद है जिसे पकड़ा जा सकता है, लेकिन यह स्वचालित रूप से फिर से पकड़ ब्लॉक के अंत में उठाया जाएगा। जब यह अपवाद उठाया जाता है, तो रनटाइम थ्रेड को समाप्त करने से पहले सभी अंत में ब्लॉक निष्पादित करता है। चूंकि थ्रेड अंतत: ब्लॉक में एक अनबिकेड कम्प्यूटेशन कर सकता है, या एबॉर्ट
Thread.ResetAbort()को रद्द करने के लिए कॉल कर सकता है, इस बात की कोई गारंटी नहीं है कि थ्रेड कभी खत्म हो जाएगा।
आपको Abort()मैन्युअल रूप से थ्रेड की आवश्यकता नहीं है । सीएलआर आपके लिए सभी गंदे काम करेगा यदि आप बस थ्रेड रिटर्न में विधि करते हैं; वह धागा सामान्य रूप से समाप्त हो जाएगा।
क्या होगा यदि एक धागा एक ताला पकड़े हुए है और गर्भपात / मार डाला गया है? संसाधन अटके हुए हैं
यह ठीक काम करता है जब एक थ्रेड खुद को गर्भपात करता है लेकिन अन्य थ्रेड द्वारा नहीं। गर्भपात, बलपूर्वक प्रभावित धागे को समाप्त कर देता है, भले ही उसने अपना कार्य पूरा न किया हो और संसाधनों की सफाई का कोई अवसर प्रदान न करता हो
संदर्भ MSDN
देखें: प्रबंधित सर्वोत्तम अभ्यास
मुझे लगता है कि लूप में फंसे एक धागे को नष्ट नहीं किया जा सकता है:
//immortal
Thread th1 = new Thread(() => { while (true) {}});
मैं हालांकि धागे को समाप्त कर सकता हूं यदि लूप के दौरान सोता है:
//mortal
Thread th2 = new Thread(() => { while (true) { Thread.Sleep(1000); }});
ThreadAborts अंत में ब्लॉक के अंदर या BeginCriticalRegion और EndCriticalRegion के बीच नहीं होगा
क्योंकि आप हैंडलर के अंदर ThreadAbortExceptionकॉल और कॉल कर सकते हैं Thread.ResetAbort।
OT: एक व्यापक, भाषा-अज्ञेय के लिए, संक्षिप्त रूप से उपयोगी और संक्षिप्त रूप से संक्षिप्त संगति पर, Verity Stob देखें !