Что такое шаблон «Слабое событие», используемый в приложениях WPF? - PullRequest
16 голосов
/ 05 февраля 2009

DLL WindowsBase определяет событие IWeakEventListener со сводкой:

Обеспечивает поддержку прослушивания событий для классов, которые ожидают получения событий через шаблон WeakEvent и System.Windows.WeakEventManager.

Это расплывчатое описание не описывает, что на самом деле представляет собой шаблон WeakEvent.

Итак, что это за шаблон, почему он используется и полезен ли он вне приложений WPF?

РЕДАКТИРОВАТЬ Некоторые хорошие ответы уже есть, но никто не говорил о том, полезен ли этот шаблон вне приложений WPF. Мне кажется, что шаблон слабых событий, например свойства зависимостей, неразрывно связан с API-интерфейсами и библиотеками WPF. Существует ли эквивалентная реализация для приложений, не относящихся к WPF?

Ответы [ 3 ]

24 голосов
/ 05 февраля 2009

Важный бит в комментариях:

Основная причина следования WeakEvent шаблон, когда событие Источник имеет время жизни объекта, которое потенциально независимый от события слушатели. Использование центрального события отправка WeakEventManager позволяет обработчикам слушателя быть сборка мусора, даже если источник объект сохраняется

Таким образом, если у вас есть объекты publisher и subscriber, то, как правило, после того, как subscriber подписался на событие publisher, subscriber не может быть собрано мусором. Паттерн слабых событий делает связь между двумя «слабыми» (как в WeakReference ) так, чтобы не было этой зависимости. (Альтернативой является отмена подписки на событие, когда subscriber хочет получить право на сборку мусора, но это становится грязным.)

11 голосов
/ 05 февраля 2009

Шаблоны WeakEvent

Подписка на события может привести к тому, что подписчики не будут собраны. Вы предполагаете, что объект будет собран, поскольку у вас нет другой ссылки на него - однако издатель событий удерживает объект слушателя и сохраняет его в памяти (если только он явно не отписывается, в этом случае вам нужно точно знать, когда Отписаться). Управляемая утечка.

Как правило, если издатель событий будет зависать дольше, чем слушатель, вы можете столкнуться с этой проблемой и должны это проверить.

WeakEvents должен помочь вам в том, что объект будет собран, если единственными активными ссылками на него являются «Weak». Вы должны быть обеспокоены этим шаблоном, только если вы планируете разрабатывать новые элементы управления, которые обычно предоставляют множество событий.

Основная идея похожа на WeakReference w.r.t. вывоз мусора.

7 голосов
/ 22 сентября 2011

В .NET 4.5 улучшена поддержка создания слабой ссылки на событие.

Вместо

source.Event += OnEvent;

Вы можете использовать новый WeakEventManager :

WeakEventManager<EventSource, EventArgs>.AddHandler(source, "Event", OnEvent);

Подробнее здесь.

...