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

Плохо ли не отменять регистрацию обработчиков событий?

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

4b9b3361

Ответ 1

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

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

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

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

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

Ответ 2

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

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