كيفية إلغاء الاشتراك من الحدث الذي يستخدم امدا التعبير ؟

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

سؤال

لدي البرمجية التالية إلى السماح واجهة المستخدم الرسومية الاستجابة إلى تغيير في المجموعة.

myObservableCollection.CollectionChanged += ((sender, e) => UpdateMyUI());

أولا وقبل كل هذا هو وسيلة جيدة للقيام بذلك ؟

الثانية:ما هو رمز إلغاء الاشتراك من هذا الحدث ؟ هو نفسه ولكن مع -= (ثم أكمل طريقة مجهول مرة أخرى) ؟

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

المحلول

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

نصائح أخرى

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

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

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

var myDelegate = delegate(sender, e){UpdateMyUI()};

myObservableCollection.CollectionChanged += myDelegate;

myObservableCollection.CollectionChanged -= myDelegate;

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

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

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

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