Когда вы добавляете обработчик события к событию (или, на самом деле, группу методов к делегату), делегат будет содержать ссылку на объект, на котором находится группа методов, если это метод экземпляра.
Другими словами, объект, запускающий события, будет удерживать ваш объект, который получает события, пока он подписан на событие.
Из-за этого, если вы покончили с этим объектом, который получает события, он все еще живет (и реагирует на события), даже если вы покончили с ним и освободите все ссылки (без отписки).
Это приводит к желанию lightweight events
, то есть событий, которые не имеют ссылки.
Это , а не , предлагаемый по умолчанию в .NET Framework из коробки, поэтому, если вы хотите реализовать это, вам придется использовать добавление и удаление аксессоров при объявлении ваше событие вместе с WeakReference для хранения делегата, который передается через параметр неявного значения.
Затем, когда вы запускаете события, вы проверяете свою коллекцию WeakReference (для этого вам нужно сохранять это отдельно), в частности свойства IsAlive и Target , чтобы определить, делегат был собран. Если нет, то вы выполняете его, в противном случае вы проходите мимо (и, скорее всего, сжимаете свой список).