2009-02-09 5 views
5

आवेदन समाप्त होने पर हमारी कोड लाइब्रेरी को अधिसूचित करने की आवश्यकता है। तो हमने System.Window.Forms.Aplication.AplicationExit ईवेंट की सदस्यता ली है। यह Winforms ऐप्स के लिए अच्छी तरह से काम करता है, लेकिन क्या यह अन्य प्रकार के अनुप्रयोगों जैसे कंसोल ऐप्स, सेवाएं और वेब ऐप्स (जैसे एएसपी.नेट) के लिए भी काम करता है? नामस्थान यह सुझाव देगा कि यह नहीं करता है, और संभवत: Application.Exit() को (स्पष्ट रूप से या implictly) कहा जाता है, जो संभवतः उठाया जाता है, जो इन अन्य मामलों के लिए कॉल करने के लिए सही नहीं हो सकता है।क्या अनुप्रयोग है। अनुप्रयोग-घटना घटना गैर-विनफॉर्म ऐप्स में बाहर निकलने के बारे में अधिसूचित होने के लिए काम करती है?

क्या कोई अन्य घटना है जो इन अन्य मामलों में बेहतर होगी या जो अधिक सार्वभौमिक होगा (महान अगर यह Winforms के लिए भी काम करता है)? उदाहरण के लिए, क्या कोई घटना है जब Environment.Exit() को कंसोल ऐप कहा जाता है?

मैं System.Diagnostic.Process में एक से बाहर निकल गया घटना का उल्लेख मिला, लेकिन इस (उदाहरण के लिए के निकास एक और प्रक्रिया की निगरानी के लिए प्रतीत होता है, और यह अपने आप के बारे में एक प्रक्रिया के द्वारा प्राप्त किया जाना प्रतीत नहीं होता है , Process.GetCurrentProcess().Exited += Process_Exited; Process.GetCurrentProcess().EnableRaisingEvents = true;)। मुझे लगता है कि प्रक्रिया वास्तव में बाहर निकलने के बाद ही उठाया जा सकता है, जिससे यह काम नहीं करेगा।

यह विशेष रूप से .NET 2.0 और C# के लिए है।

उत्तर

9

हमें अंततः इसके बारे में अधिक जानकारी मिली (लेकिन तब तक मेरी मशीन का पुनर्निर्माण और मेरी अनियंत्रित प्रोफ़ाइल पर कुकीज़ खो दी गई थी, उम्मीद है कि यह इस उत्तर को पोस्ट करने देगा)।

आगे की जांच के अंत में कुछ और किसी घटना के समय जो हमारे लिए उपयोगी पाया है पाया:

System.Windows.Forms.Application.ThreadExit - आग जब संदेश पाश बाहर निकालता है System.Windows.Forms.Application.ApplicationExit - आग जब सभी संदेश लूप से बाहर निकलें System.AppDomain.CurrentDomain.DomainUnload - आग जब एक डोमेन डिफ़ॉल्ट के अलावा अन्य System.AppDomain.CurrentDomain.ProcessExit - जब डिफ़ॉल्ट ऐप डोमेन System.AppDomain.CurrentDomain.UnhandledException से बाहर निकलता है - आग लगती है जब कोई अपवाद अपवाद होता है, तो ऐप समाप्त होता है।

केवल DomainUnload या ProcessExit घटनाओं में से एक, किसी दिए गए एप्लिकेशन डोमेन के लिए संभव हो रहे हैं कि क्या यह डिफ़ॉल्ट (उच्च-स्तर) की प्रक्रिया के लिए डोमेन है पर निर्भर करता है या किसी उपडोमेन के रूप में बनाया गया था (जैसे। एक वेब सर्वर पर) । यदि कोई एप्लिकेशन नहीं जानता कि यह कौन सा हो सकता है (जैसा कि हमारे मामले में है), तो उसे दोनों के लिए सब्सक्राइब करना होगा यदि वह अपने लिए वास्तविक अनलोड को पकड़ना चाहता है। साथ ही, ऐसा लगता है कि UnhandledException (जो .NET2.0 हमेशा घातक है) अन्य दो घटनाओं को रोक सकता है, ताकि यह संभालने का तीसरा मामला हो। इन तीनों घटनाओं को किसी भी .NET अनुप्रयोग के लिए काम करना चाहिए।

एक चेतावनी है कि ProcessExit के लिए निष्पादन का समय बाध्य है (लगभग 4 सेकंड?), इसलिए उस ईवेंट हैंडलर में व्यापक "अंतिम" काम करना संभव नहीं हो सकता है। इसे कुछ ऐसा करने की जरूरत है जिसे जल्दी से किया जा सके।

Application ईवेंट केवल WinForms अनुप्रयोगों पर लागू होते हैं (हमें संदेह है कि वे शुद्ध WPF अनुप्रयोगों में लागू नहीं हो सकते हैं)। नामकरण भ्रामक हो सकता है क्योंकि उन्हें उनके सबसे सामान्य सामान्य उपयोग के लिए नामित किया गया है जिसमें कुछ मान्यताओं हैं। ThreadExit वास्तविक System.Threading.Thread से संबंधित नहीं है बल्कि यूआई थ्रेड के संदेश लूप (Application.Run())) से संबंधित है, और ApplicationExit समान रूप से एक या अधिक UI थ्रेड पर एप्लिकेशन प्रपत्रों के संग्रह से संबंधित है। आम तौर पर, Application.Run() रिटर्न पर कॉल करने के बाद, थ्रेड की प्रविष्टि विधि से बुलाया जाता है, प्रविष्टि विधि जल्दी समाप्त होती है और धागा स्वयं समाप्त होता है। और एक बार सभी यूआई थ्रेड निकल गए हैं, तो WinForms ऐप आमतौर पर किया जाता है और बाहर निकलता है।

नोट की एक और घटना System.Windows.Forms.Application.ThreadException घटना है। एक संदेश संदेश लूप को अपवादों को पकड़ने के लिए कॉन्फ़िगर किया जा सकता है जो एक संदेश को संभालने में होते हैं और उन्हें इस घटना को भेजने के बजाय उन्हें बेकार (और इस प्रकार घातक) अपवादों को छोड़ने के बजाय भेजते हैं। इन अपवादों को पकड़ने से संदेश लूप (और वह यूआई थ्रेड) चलने के लिए अनुमति देता है (वर्तमान संदेश हैंडलर को निरस्त करने के बाद)। किसी दिए गए थ्रेड के लिए किसी भी समय इस ईवेंट के लिए केवल एक ग्राहक हो सकता है (सब्सक्रिप्शन किसी भी पिछले ग्राहक को ओवरराइट करता है), और संदेश लूप दर्ज करने से पहले किसी फॉर्म को सब्सक्राइब करने से पहले कॉन्फ़िगर किया जाना चाहिए। अधिक जानकारी के लिए इस घटना के लिए एमएसडीएन सहायता और System.Windows.Forms.Applicaton.SetUnhandledExceptionMode() देखें।

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