2011-10-18 9 views
6

Application.ThreadException के लिए reference page कहतेआवेदन। थ्रेड अपवाद: अगर स्मृति अलग नहीं है तो स्मृति रिसाव?

क्योंकि यह एक स्थिर घटना है, तो आप अपने ईवेंट हैंडलर्स जब आपके आवेदन निपटान किया जाता है, या मेमोरी लीक परिणाम होगा अलग करना होगा।

इस तथ्य के बावजूद कि उस पृष्ठ पर नमूना कोड इवेंट हैंडलर को अलग नहीं करता है, क्या यह वास्तव में रिसाव करता है यदि ईवेंट हैंडलर अलग नहीं होता है?

ऐसा लगता है कि यदि एप्लिकेशन बंद हो जाता है तो हैंडलर को अलग किया जाना चाहिए। उस स्थिति में, हैंडलर अलग हो गया है या नहीं, आवेदन द्वारा उपयोग की जाने वाली सभी मेमोरी वैसे भी मुक्त हो जाएगी?

+3

हां, ऐप टर्मिनेट्स से पहले आपके ईवेंट हैंडलर को मिलीसेकंड को अनधिकृत नहीं करना एक रिसाव नहीं है। –

उत्तर

4

यह शायद बहुत ही असामान्य है, लेकिन एक WinForms आवेदन के Main() विधि संभवतः, किसी कारण से, ऐसा दिखाई दे सकता:

static bool AbortStartup { get; set; } 

[STAThread] 
public static void Main() 
{ 
    Application.Run(new CancelableSplashScreen()); 

    if (!AbortStartup) 
     Application.Run(new MainWindow()); 
} 

जब स्प्लैश स्क्रीन बंद कर देता है, मुख्य विंडो दिखाई देगा जब तक कि स्प्लैश स्क्रीन AbortStatup संपत्ति true पर सेट करें। यदि आपने स्प्लैश स्क्रीन के भीतर से Application.ThreadException पर इवेंट हैंडलर जोड़ा है, तो CancelableSplashScreen का उदाहरण तब तक कचरा नहीं होगा जब तक कि एप्लिकेशन समाप्त नहीं हो जाता है, जो बाद में काफी समय हो सकता है।

1

यदि आप ऑब्जेक्ट का संदर्भ देते हैं (माना जाता है कि यह एक उदाहरण विधि है जो घटना हैंडलर है) तो हाँ, एक रिसाव होगी; आप ईवेंट से सदस्यता समाप्त नहीं कर पाएंगे (क्योंकि आपके पास अब और उदाहरण नहीं है) और ऑब्जेक्ट तब तक अस्तित्व में रहेगा जब तक ऐप डोमेन समाप्त नहीं होता है (क्योंकि यह स्थैतिक चर का जीवनकाल है)।

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