Вопрос по events, c#, event-handling – Это плохо, чтобы не отменить регистрацию обработчиков событий?
=====================================================================================================

Если у меня есть приложение с несколькими зарегистрированными обработчиками событий (и объекты, использующие события, не удаляются до тех пор, пока приложение не будет закрыто), действительно ли мне нужно беспокоиться об отмене регистрации этих обработчиков? Единственная веская причина, которую я мог видеть, состоит в том, что могут быть некоторые дополнительные издержки, если запускаются события, о которых вам не нужно заботиться (т. Е. У вас есть несколько обработчиков, зарегистрированных на одно событие). Есть ли другие веские причины для этого? Кто-нибудь сталкивался с серьезными проблемами, потому что они не отменили регистрацию событий?

Если у вас есть`A` опубликовать событие, и`B` подписаться на событие (обработчик), тогда только проблема не отписаться, если`A` будет жить намного дольше, чем`B`, По сути, подписка на событие означает, что`A` еще можно увидеть`B`поэтому он не будет собирать мусор и будет запускать события, даже если вы об этом забыли (и, возможно,`Disposed()` Это).

Например, это проблема, если`A` является статическим событием, и ваше приложение работает некоторое время после`B` умирает ... но`B` будет жить до тех пор, пока`A` таким образом`B` не будет мусора.

Важно отметить, можно спросить следующее:

if B lives a lot longer than A, will B keep A from being garbage collected?

И ответом на это является «нет». B не имеет ссылки на A через событие; А будет собираться как обычно



Кажется, что многие люди думают, что отписаться от событий важно только в том случае, если издатель собирается пережить подписчика. Мне не нравится этот подход. Подписчик события, который не отсоединяется от издателя, создает некоторые неприятные зависимости от поведения сущностей вне издателя и подписчика. Если ссылка на издателя удерживается дольше, чем ожидалось, это сохранит подписчика в живых вместе с любыми объектами, на которые подписчик имеет ссылку. Если большая масса заброшенных объектов соединена между собой обработчиками событий, но ни одна из них не имеет живой ссылки, все объекты могут быть найдены сборщиком мусора. Однако, если кто-то где-то неожиданно сохраняет ссылку на один из объектов, это может помешать любому из них быть собранным мусором.

ИМХО, гораздо лучше быть активным в удалении обработчиков событий, чем отказываться от них и надеяться, что все будет очищено. Если не быть уверенным в том, что неожиданные ссылки на издателя не могут существовать, такой подход, скорее всего, «в основном». работают, но вызывают случайные утечки памяти.