Это плохо, чтобы не отменить регистрацию обработчиков событий? - PullRequest
62 голосов
/ 30 июня 2009

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

Ответы [ 2 ]

80 голосов
/ 30 июня 2009

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

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

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

если B живет намного дольше, чем A, будет ли B удерживать A от сбора мусора?

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

15 голосов
/ 22 февраля 2011

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...