/ 2-विंडो परिदृश्य में मेमोरी लीक से बचने का सबसे सरल तरीका - wpf, इवेंट्स, मेमोरी-लीक

2-विंडो परिदृश्य में मेमोरी लीक से बचने की सरल विधि - डब्ल्यूपीएफ, इवेंट्स, मेमोरी-रिसाव

मेरे पास दो खिड़कियां हैं: ए स्वामी खिड़की, और ए विवरण खिड़की जो एक पर डबल-क्लिक करके खोला जाता हैमास्टर विंडो के डेटाग्रिड में विशिष्ट पंक्ति। मैं विवरण विंडो में डेटा सहेजे जाने पर मास्टर विंडो के डेटाग्रिड नियंत्रण को ताज़ा करना चाहूंगा।

(कुछ अप्रासंगिक विवरण: प्रत्येक विंडो एक से विरासत में मिली है BaseWindow वर्ग, और EF5 से विरासत में मिली कक्षा की अपनी प्रति है DbContext। मैंने "a" जोड़ा Save आंशिक वर्ग को घटना और ओवरराइड SaveChanges जब भी इस घटना को बढ़ाने के लिए SaveChanges कहा जाता है। यह वास्तव में वह घटना है जिसके लिए मैं एक इवेंट हैंडलर संलग्न कर रहा हूं।)

मुझे पता है कि मैं एक इवेंट हैंडलर को संलग्न करके ऐसा कर सकता हूं Save घटना। हालाँकि, मुझे इस बात का कोई अंदाजा नहीं है कि किस क्रम में खिड़कियां बंद की जाएंगी - यदि मास्टर विंडो को पहले बंद कर दिया गया है, तब भी विवरण विंडो के उदाहरण के अनुसार इसका संदर्भ होगा।

अगर मैं सुनूं Closing"/"Closed मास्टर विंडो की घटना इसलिए मैं बता सकता हूं कि कब"सहेजें" घटना से जुड़े हैंडलर को जारी करें, मुझे रिवर्स में एक ही समस्या होगी - मास्टर विंडो विवरण विंडो बंद होने के बाद भी विवरण विंडो का संदर्भ देगी।

मुझे पता है कि मैं इसे लागू कर सकता हूं WeakEventManager के रूप में वर्णित यहाँ, लेकिन मैं जानना चाहूंगा कि क्या कोई सरल तकनीक है जिसका मैं उपयोग कर सकता हूं। ("मुझे बताया गया है कि मैं चीजों को उलझाने की प्रवृत्ति रखता हूं।"

(मैं MVVM का उपयोग नहीं कर रहा हूं।)

उत्तर:

जवाब के लिए 0 № 1

WeakEventManager काम करेंगे, बस जेनेरिक संस्करण का उपयोग करें और इसके बारे में कुछ भी जटिल नहीं है। प्रदर्शन बुद्धिमान जो आपके मामले में पूरी तरह ठीक होना चाहिए।

इवेंट हैंडलर को अनसब्सक्राइब करने के लिए एक अलग विकल्प होगा Closing जैसा कि आपने कहा मास्टर खिड़की से मास्टर विंडो।

विवरण विंडो बंद होने पर सभी संदर्भों को हटाने के लिए, विस्तार विंडो के भीतर सभी ईवेंट हैंडलर को अनसब्सक्राइब करें जब विवरण विंडो बंद हो जाती है, तो इस विधि की सदस्यता लेकर Closing घटना:

public OnClosing()
{
Delegate[] registeredDelegates = saveHandler.GetInvocationList();
foreach (Delegate d in registeredDelegates )
saveHandler-= (d as SaveDelegate);
}

जहाँ SaveHandler आपका हैंडलर है और SaveDelegate आपका कस्टम प्रतिनिधि प्रकार है

कहा जा रहा है, अगर आप अपनी ओवरकंप्लिकेशन इमेज से छुटकारा पाना चाहते हैं, तो बस "टी केयर ...