मेरे निष्कर्ष अब तक ...
प्रिज्म, एकता, WPF और MVVM के अलावा हम भी इकाई की रूपरेखा और Xceed डेटा ग्रिड का उपयोग कर रहे हैं। डॉटट्रेस का उपयोग कर मेमोरी प्रोफाइलिंग किया गया था।
मैंने अपने दृश्य मॉडल के लिए बेस क्लास पर आईडीस्पोजेबल को कार्यान्वित करना समाप्त कर दिया है जिसमें डिस्प्ले (बूल) विधि को आभासी घोषित किया जा रहा है जिससे उप वर्गों को भी साफ करने का मौका दिया जा सकता है। चूंकि हमारे आवेदन में प्रत्येक दृश्य मॉडल को एकता से एक बच्चे कंटेनर मिलता है, हम इसे भी निपटान करते हैं, हमारे मामले में यह सुनिश्चित करता है कि ईएफ का ऑब्जेक्ट कॉन्टेक्स्ट गुंजाइश से बाहर हो गया। यह स्मृति रिसाव का हमारा प्रमुख स्रोत था।
दृश्य मॉडल को मूल नियंत्रक वर्ग पर एक स्पष्ट CloseView (UserControl) विधि के भीतर निपटाया गया है। यह दृश्य के डेटाकॉन्टेक्स्ट पर एक आईडीस्पोजेबल ढूंढता है और कॉल पर इसका निपटान करता है।
एक्सवाइड डेटा ग्रिड लीक का उचित हिस्सा बन रहा है, खासकर लंबे समय तक चलने वाले विचारों में। कोई नया दृश्य जो नए संग्रह को स्वीकार करके डेटा ग्रिड के आइटमसोर्स को रीफ्रेश करता है, उसे नया संग्रह करने से पहले मौजूदा संग्रह पर साफ़() को कॉल करना चाहिए।
इकाई फ्रेमवर्क से सावधान रहें और किसी भी लंबे समय तक चल रहे ऑब्जेक्ट संदर्भों से बचें। जब बड़े संग्रह की बात आती है तो यह बहुत क्षमाशील होता है, भले ही ट्रैकिंग चालू हो जाने पर संग्रह को हटा दिया गया हो, फिर भी यह संग्रह में हर आइटम का संदर्भ रखेगा, भले ही आप उन्हें लटका नहीं देते।
यदि आपको इकाई को अद्यतन करने की आवश्यकता नहीं है तो इसे MergeOption के साथ पुनर्प्राप्त करें। अस्वीकरण, विशेष रूप से लंबे समय तक रहने वाले विचारों में जो संग्रह से बंधे हैं।
लंबे जीवन के साथ विचारों से बचें, जब वे दृश्यमान नहीं हैं, तो उन्हें उस क्षेत्र में न पकड़ें, इससे आपको दुःख मिलेगा, विशेष रूप से यदि वे दिखाई देने पर नियमित अंतराल पर अपने डेटा को रीफ्रेश करते हैं।
Xceed कॉलम पर CellContentTemplates का उपयोग करते समय गतिशील संसाधनों का उपयोग न करें क्योंकि संसाधन सेल के संदर्भ में होगा, जो बदले में पूरे दृश्य को जीवंत रखेगा।
Xceed कॉलम पर सेलएडिटर का उपयोग करते समय और संसाधन बाहरी संसाधन शब्दकोश में संग्रहीत किया जाता है x: साझा = "False" सेल एडिटर युक्त संसाधन में, एक बार फिर संसाधन सेल का संदर्भ रखेगा, x का उपयोग कर : साझा = "झूठा" सुनिश्चित करता है कि आपको हर बार एक ताजा प्रति प्राप्त हो, पुराने व्यक्ति को सही ढंग से हटाया जा रहा है।
अधिक डेटा डेटा ग्रिड के भीतर आइटम्स को डिलीगेट कमांड को बाध्य करते समय सावधान रहें, यदि आपके पास कमांड पर मौजूद डिलीट बटन जैसे केस हैं, तो दृश्य को बंद करने से पहले आइटमसोर्स युक्त संग्रह को साफ़ करना सुनिश्चित करें । यदि आप संग्रह को रीफ्रेश कर रहे हैं तो आपको कमांड को फिर से शुरू करने की आवश्यकता है और साथ ही कमांड प्रत्येक पंक्ति का संदर्भ रखेगा।
एलओएल, यह एक गहरा छेद है जो मैं खुद को खोद रहा हूं;) मैं उत्सुक था कि आपके संलग्न व्यवहार उपयोगकर्ता नियंत्रण पर क्या लगाता है, मैं दृश्य को समाप्त होने पर पता लगाने के लिए कुछ रास्ता ढूंढ रहा हूं। अनलोडेड स्पष्ट पसंद की तरह लगता है लेकिन यह बहुत मदद नहीं करता है क्योंकि जब भी दृश्य निष्क्रिय हो जाता है तो यह आग लग जाएगा –
आह यह कस्टम है।जब भी किसी दृश्य को बंद करने की आवश्यकता होती है तो हमारे पास एप्लिकेशन आदेशों के सेट पर एक विधि कॉल की जाएगी। CloseView (ऑब्जेक्ट व्यू)। मैं संलग्न संपत्ति के पीछे स्टोर के साथ जांच करता हूं कि यह देखने के लिए कि उसके दृश्य या उसके किसी भी बच्चे के दृश्य निकट हैंडलर के लिए पंजीकृत हैं या नहीं। यदि ऐसा है, तो मैं उनके द्वारा पंजीकृत विधि को कॉल करता हूं। बाल विचारों का पता लगाने के लिए यहां एकमात्र जादू लॉजिकल ट्रीहेल्पर और विजुअल ट्रीहेल्पर कक्षाओं का उपयोग है। http://msdn.microsoft.com/en-us/library/system.windows.media.visualtreehelper.aspx –
हमने भी अनलोड किया, btw। कुछ मामलों में यह ठीक था ... हम उन टाइमर को रोक देंगे जो अनिवार्य रूप से केवल ताज़ा डेटा थे और यदि दृश्य दिखाई नहीं दे रहा था (जैसे कि यह टैब या कुछ पर था) तो इसे रीफ्रेश करने का कोई कारण नहीं था, लेकिन कभी-कभी आप केवल एक टाइमर की आवश्यकता नहीं है जब तक कि दृश्य मारे नहीं जाता है और यह स्पष्ट नज़दीकी चीज़ सबसे अच्छी थी जिसके साथ हम आ सकते थे। –