أي أفكار حول كيفية كتابة قاعدة تحليل ثابتة (FXCop) لضمان إزالة مفوضي الأحداث

StackOverflow https://stackoverflow.com/questions/854716

سؤال

لقد مررنا بتحليل كبير لتسرب الذاكرة ووجدنا أن أحد العوامل المساهمة كان عدم إزالة المفوضين في الأحداث مما تسبب في عدم GCed للكائنات بسرعة كافية (أو في بعض الأحيان إلى الأبد).

هل لدى أي شخص أي أفكار حول كيفية كتابة قاعدة في FXCop لضمان إزالة المندوبين من المعالجات؟

لقد رأيت للتو هذا وعلى هذا النحو سأطلب هناك لمزيد من المعلومات.

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

المحلول

حسنًا، بجانب مشكلة تنفيذ الفحص الفعلي (في رأيي، هذا مشابه جدًا لـ a تغطية المسار وبالتالي غير عملي) - إليك طريقة كتابة قاعدة FxCop جديدة:

في البداية بعض المقالات التي ساعدتني ذات مرة:

إن تنفيذ قاعدة بسيطة ليس بالأمر الكبير.في مشروعك، تحتاج إلى ملف Rules.xml كمورد مضمن (انظر هنا).أنت تستمد صفك من BaseIntrospectionRule وأضف الكود الخاص بك إلى طريقة Check():

public override ProblemCollection Check( TypeNode typeNode )
{
  if( type.IsPublic )
  {
    Problems.Add( new Problem( ... ) );
  }
  return Problems;
}

لقد فعلت هذا منذ عدة مرات.آمل أن لا يزال يعمل كما هو موضح :)

نصائح أخرى

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

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

وهناك الاستدلال أستطيع الخروج مع في هذه الحالة: تحليل كافة الكائنات المحلية-متغير (التي يتم راقب من قبل كتلة القانون الحالي {}) وكافة الكائنات، والتي تخلص صراحة. لكل حدث على هذه الكائنات حساب عدد المرات التي الاشتراك فيها وعدد المرات التي إلغاء الاشتراك. إذا كان الرقم الأول هو أكبر ثم تصدر تحذيرا.

وطبعا هذا لا يشمل جميع الحالات، ولكن أعتقد أي نهج ثابت يمكن أن تغطي جميع الحالات في هذه المشكلة، تحتاج بعض الطرق التي هي جيدة بما فيه الكفاية.

أنا لن أذكر مزايا التحليل الديناميكي ومراجعات كود هنا كما هو موضوع منفصل، لا علاقة لهذه المسألة.

هل يمكن ان فرض القاعدة التي ينبغي التعامل مع كافة الاشتراكات الحدث من خلال WeakReferences؟ أنا أفكر هذا ينبغي أن يكون أسهل في التنفيذ من الحاجة إلى تحليل التدفق الفعلي للبرنامج الخاص بك.

هل هي آمنة لنفترض الكائنات تنفيذ معالجات لديها مراجع بطريقة أو بأخرى إلى كائن مع الأحداث؟ إذا كان هذا هو حال كنت أفضل حالا معرفة كيفية كسر حلقة طريقة أخرى.

وكان لدينا شيئا من هذا القبيل يحدث في حين يعود مع معالجات الأحداث على صفحات ASP.NET. وكان الكائنات التي تنفذ معالجات أيضا إشارات إلى صفحات. بعد كسر أكبر عدد ممكن من الروابط architectually ما نستطيع، وتم تغيير بعض المبالغ اليسرى لWeakReferences. أي مشاكل مزيد من الذاكرة!

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