Подтвердить что ты не робот

Что такое шаблон "Слабый случай", используемый в приложениях WPF?

DLL WindowsBase определяет событие IWeakEventListener с резюме:

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

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

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

EDIT. Некоторые хорошие ответы уже есть, но никто не говорил о том, полезен ли этот шаблон вне приложений WPF. Мне кажется, что шаблон слабых событий, как и свойства зависимостей, неразрывно связан с API-интерфейсами WPF и DLL. Существует ли эквивалентная реализация для приложений, отличных от WPF?

4b9b3361

Ответ 1

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

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

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

Ответ 2

Шаблоны WeakEvent

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

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

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

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

Ответ 3

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