Как отказаться от подписки на событие, в котором используется лямбда-выражение?

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