سؤال

خلفية التطبيق

برنامجنا هو النقر مرة واحدة في تطبيق WPF.لدينا "شل" الذي يحتوي على قائمة التنقل هيكل وتستضيف الخاصة بنا العرف "في صفحة" دروس.عند الانتقال إلى صفحة جديدة ، ونحن مبادلة خارج المحتوى من قذيفة (أساسا).

المشكلة

لذلك أنا أعمل في الشركة التي تعمل على كبيرة للغاية مشروع البرمجيات.لدينا الكثير من التعليمات البرمجية التي وجدنا مشاكل الذاكرة مع.

المشكلة هي أن هناك الكثير من الأماكن في التطبيق كانت الأحداث السلكية و لم مثير.لست متأكدا لماذا المطورين كانوا يفعلون هذا ، أعتقد أنهم المتوقع الكائنات للحصول على تنظيف كل مرة يتنقل المستخدم إلى "الصفحة".

ليس لدينا خيار إعادة بيع ديون كل صفحة (في هذا الإصدار).هل هناك طريقة مع C# إلى إزالة كافة المراجع من كائن ؟ (وبالتالي السماح جامع القمامة إلى رمي هذا الكائن بعيدا ، جنبا إلى جنب مع كل من المراجع الداخلي)

نحن نحاول الحصول على هذه الذاكرة إلى الوراء ، لكنها معقدة جدا للعثور على الأشياء لا تزال الرجوع إلى الصفحات (كائن المراجع) ، عندما يكون لدينا WPF للتعامل مع.

لقد بحثنا في visual ومنطقية الأشجار المستخدمة التنميط تطبيقات تساعدنا على تنظيف يدويا الامور (إثبات أصل فكرة) و هذا ثبت أن من الصعب للغاية كذلك.

جلست و فكرت لماذا نفعل كل هذا العمل على إيجاد مراجع الكائنات, لا يمكننا فقط "إلغاء مرجعية" هذا "الصفحة" عندما يكون مغلق ؟

الذي يجلب لي هنا :)
أي مساعدة هي موضع تقدير كبير!


تحديث 1

في التعليقات التالية سئل:

Q: هل التطبيق.في الواقع لديهم مشاكل في الذاكرة ؟ كيف هي هذه معارضها/الكشف ؟ أو هو هذه الذاكرة التسكع حتى GC2 يحدث ؟ – ميتش القمح

A: كان لديه مشاكل في الذاكرة.إذا تركنا صفحة (الملكية التي تحمل الصفحة يحصل على تعيين وجوه جديدة) وجوه قديمة لم يحصل جمعها جمع القمامة.حتى الذاكرة وتبقي فقط على النمو.إذا بدأت الشركة مع هذا التطبيق.أول شيء يجب أن ننظر سيكون تنفيذ WeakEvent أنماط استخدام المزيد من توجيه الأوامر في WPF.

تحديث 2

وكنت قادرا على الخروج مع بلدي الحل.

هل كانت مفيدة؟

المحلول 2

انا نفذت WeakEvents لحل هذه المشكلة.

للأسف, توصي Microsoft استخدام WeakEventManager قاعدة الطبقة وخلق نوع مدير لكل حدث في التطبيق الخاص بك!!!حاولت أن أكتب مدير يرث من هذه القاعدة على أن تكون أكثر من "عامة" (وليس في C# مصطلح عام).هذه "الشائعة" مدير الحدث لم يكن ممكنا مع مايكروسوفت الفئة الأساسية.كان لا بد أن أكتب مدير الحدث من الصفر.

شكرا لك على أي مساعدة نشرها على هذا السؤال.

نصائح أخرى

هل تستخدم CLRProfiler?أجد هذا جيد جدا في إيجاد الكائنات وإيجاد أيضا ما يحمل إشارة إليها.

هذا "كيفية" الصفحة...

http://msdn.microsoft.com/en-us/library/ms979205.aspx

...روابط تحميل الموقع.

ومع ذلك, أعتقد أن الجواب على سؤالك هو "لا".ليس هناك طريقة للقول "كائن فو لم تعد مطلوبة - جمع ذلك يرجى بغض النظر عما إذا كانت الجذور أو لا".جمع الجذور كائن يمكن إدخال كل أنواع السوء في التطبيق الخاص بك.

إذا حفرة صفحة الخروج من النطاق ، بما في ذلك جميع البيانات الأساسية ، GC جمع ذلك.في نهاية المطاف.ومع ذلك لو أن الصفحة التي يتم الرجوع إليها بواسطة أي شيء لا يزال في نطاق الصفحة و جميع البيانات ستبقى في الذاكرة و GC لن تكون قادرة على جمع.

بقدر ما أعرف لا يوجد زر السهل عندما يتعلق الأمر إلى تحديد سوء إدارة الذاكرة.هذا يعني فقط ، في رأيي ، هو أن تفعل العمل لتنظيف المراجع.وهذا سيجعل من الأسهل بالنسبة GC لجمع الأشياء التي هي خارج النطاق.

يمكنك أن تشير إلى GC أن تذهب من خلال خوارزمية أن نرى إذا كان أي شيء يمكن جمعها عن طريق الاتصال GC.جمع().ولكن هذا لن تفعل سوى القليل جدا إلى جانب النفايات دورات وحدة المعالجة المركزية إلا إذا كانت البيانات هو حقا للخروج من نطاق.

السؤال Phobis, هو مقدار الذاكرة التطبيق الخاص بك باستخدام ؟

تحرير:

رابط CLR التعريف 2.0 التي يجب أن تعمل .net3.5 تطبيقات.http://www.microsoft.com/downloads/details.aspx?familyid=a362781c-3870-43be-8926-862b40aa0cd0&displaylang=en

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top