2012-03-02 12 views
16

क्या होता है जब मैं अपने सी # कंसोल एप्लिकेशन को नियंत्रण-सी के साथ बाधित करता हूं?क्या होता है जब मैं नियंत्रण सी के साथ एक सी # कंसोल अनुप्रयोग को बाधित करता हूं?

क्या प्रक्रिया मारे गए? क्या स्मृति मुक्त है? finally ब्लॉक निष्पादित हैं? डेटाबेस कनेक्शन के साथ क्या होता है?

क्या इनमें से कोई भी भिन्न है यदि अनुप्रयोग डीबग या रिलीज़ के लिए बनाया गया है, या विजुअल स्टूडियो के अंदर/बाहर चलाया गया है?

उत्तर

11

लघु उत्तर: यह CTRL-C के बाद कुछ भी नहीं कर रही है

लांग उत्तर: वहाँ MSDN जो स्पष्ट रूप से कहा गया है, यह एक संकेत (व्यवधान) भेजता है पर इसके बारे में अच्छा लेख है कुंजी दबाने के बजाय -आयोजन।

एक cancelKeyPress-Event भी ट्रिगर किया गया है जिसे आप सब्सक्राइब कर सकते हैं और जो कुछ भी आप चाहते हैं!

अनजाने में डिफ़ॉल्ट रूप से क्या किया जाता है, इसके बारे में कोई और जानकारी नहीं है। शायद सबसे बुरे मामले में आप इसे अपने आप से देख सकते हैं। लेकिन imo इसके बारे में कुछ प्रलेखन होना चाहिए ...

अद्यतन: Alois क्राउस एक codeproject-Article लिखा था के बारे में शान से नीचे CTRL-C प्राप्त करने के बाद एक सांत्वना आवेदन shuting।

Alois क्राउस के शब्दों में:

CLR के डिफ़ॉल्ट व्यवहार को कुछ भी नहीं करना है। इसका मतलब यह है कि सीएलआर को DLL_PROCESS_DETACH अधिसूचना द्वारा बहुत देर से अधिसूचित किया गया है जिसमें संदर्भ कोई प्रबंधित कोड अब और नहीं चल सकता है क्योंकि ओएस लोडर लॉक पहले से ही लिया जा चुका है। हमें दुर्भाग्यपूर्ण स्थिति में छोड़ दिया गया है कि हमें कोई अधिसूचना नहीं मिलती है और न ही कोई अंतिम फाइनल चलाता है। सभी धागे चुपचाप मार डाले जाते हैं बिना किसी क्रमशः शटडाउन करने के लिए अपने पकड़/आखिरकार ब्लॉक निष्पादित करने का मौका। मैंने पहली वाक्य में डिफ़ॉल्ट कहा, क्योंकि इस स्थिति को गहन तरीके से संभालने का एक तरीका है। कंसोल क्लास को .NET 2.0: Console.CancelKeyPress के साथ एक नया ईवेंट सदस्य मिला है। यह आपको Ctrl-C और Ctrl-Break कुंजी की अधिसूचना प्राप्त करने की अनुमति देता है जहां आप शट डाउन रोक सकते हैं (केवल Ctrl-C के लिए, लेकिन Ctrl-Break नहीं)। यहां मुख्य समस्या यह है कि यदि आप Ctrl-C/Break ईवेंट को पकड़ते हैं और हैंडलर से बाहर निकलें तो कोई फाइनल नहीं है। यह वह नहीं है जिसे मैं सहकारी शटडाउन कहूंगा। मेरे दिमाग में आने वाली पहली बात पर्यावरण को कॉल करना है। एक्सिटिट करें लेकिन यह किसी भी फाइनलाइज़र को ट्रिगर नहीं करता है। सब कुछ नहीं खोया है। मैं सभी फाइनलरों को चलाने के लिए एक गंदे चाल के साथ आया था: हम इवेंट हैंडलर के अंदर थोड़ा सा सहायक धागा स्पिन करते हैं जो पर्यावरण को कॉल करेगा। एक्सिट। वोला, हमारे फाइनलाइजर्स को बुलाया जाता है।

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