Нужно ли мне отказываться от подписки на события (подписанные вручную) в asp.net?

Применяются ли те же самые лучшие практические правила в отношении подписки / отказа от подписки на события в asp.net?

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

Пример 1. На странице в методе Page_Load я подписываюсь на событие обновления в ListView. Должен ли я отказаться от подписки на это событие позже, например, в методе OnPreRenderComplete?

Пример 2: В шаблоне пассивного представления представление (элемент управления страницей / пользовательское управление) будет вызывать событие всякий раз, когда ему нужно, чтобы докладчик что-либо сделал. Таким образом, ведущему необходимо подписаться на события в представлении, но нужно ли ему снова отказаться от подписки на события?

С уважением, Эгиль.


person Egil Hansen    schedule 05.12.2008    source источник


Ответы (2)


Экземпляр страницы и все его компоненты будут "выходить из области видимости" после завершения запроса, например они получают право на GC. Таким образом, ваш ListView выйдет из области видимости вместе с элементами управления Page / user на нем. Вам не нужно отказываться от подписки (если, например, вы не подписаны на событие, принадлежащее какому-то синглтону, сохраняющему каждый запрос и использующему один из методов страницы в качестве обработчика событий).

То же самое верно и для докладчика (опять же, если этот докладчик используется только с одной страницей и после этого выходит за рамки).

person liggett78    schedule 05.12.2008
comment
Хорошо, просто чтобы убедиться, что я вас правильно понимаю: если у меня есть одноэлементный объект в кеше asp.net, презентатор не должен подписываться на событие по этому поводу, поскольку одноэлементный объект не будет удален, когда страница выйдет за пределы области видимости, а ведущий при этом будет торчать? - person Egil Hansen; 06.12.2008
comment
Да, я обновил формулировку своего ответа. По сути, вы не должны оставлять никаких ссылок на страницу (или какой-либо элемент управления на ней) с вашими долгоживущими объектами. Такой ссылкой может быть обработчик событий. - person liggett78; 06.12.2008
comment
Просто пример: если вы подписываетесь на событие долгоживущего объекта и используете один из методов своей страницы в качестве обработчика, то ваш долгоживущий объект содержит ссылку на страницу. Для GC страница все еще видна / находится в области видимости. Хотя статический метод в качестве обработчика событий подойдет. - person liggett78; 06.12.2008
comment
И, конечно же, вы можете подписаться на любое событие, даже на долгоживущие объекты, при условии, что вы отключите событие после того, как закончите. Просто чтобы прояснить :-) - person liggett78; 06.12.2008
comment
Я столкнулся с обработчиком событий singleton, предотвращающим проблему GC в Winforms, и вызывал приятную утечку памяти с диалоговыми окнами. Простым решением было убедиться, что я удаляю обработчик, когда пытаюсь закрыть / удалить диалоговое окно, и все было хорошо. - person Chris Porter; 15.01.2009

В общем, нет. Предполагается, что события будут автоматически сбрасываться при выгрузке страницы. Должно быть. Раньше я сталкивался с ошибкой (в .NET 1.1), где этого не было.

Я не буду утруждать себя отказом от подписки, если не замечу проблемы со страницей (например, метод, вызываемый 20 раз из фантома в стеке вызовов: обычно это признак того, что что-то не отписывается должным образом).

person TheSmurf    schedule 05.12.2008