हमें अंततः इसके बारे में अधिक जानकारी मिली (लेकिन तब तक मेरी मशीन का पुनर्निर्माण और मेरी अनियंत्रित प्रोफ़ाइल पर कुकीज़ खो दी गई थी, उम्मीद है कि यह इस उत्तर को पोस्ट करने देगा)।
आगे की जांच के अंत में कुछ और किसी घटना के समय जो हमारे लिए उपयोगी पाया है पाया:
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()
देखें।
स्रोत
2009-07-20 18:49:31