Можно ли верить, что Page_Unload всегда будет работать и является хорошим местом для кода Dispose ()? - PullRequest
6 голосов
/ 01 апреля 2009

Я знаком с шаблоном try {} finally {}, шаблоном using () {} как способом обеспечения вызова Dispose (), но для страницы ASP.NET это так же безопасно для объекты, созданные в области видимости для события Page_Unload? Имеет ли смысл вместо этого переопределить метод Dispose () страницы?

Я не уверен, какой код вызывает событие Page_Unload или метод Page Dispose (), поэтому я не знаю, каковы гарантии его запуска.

Ответы [ 2 ]

9 голосов
/ 01 апреля 2009

Событие разгрузки возникает в жизненном цикле управления непосредственно перед утилизацией. Поскольку сама страница является элементом управления, для нее также генерируется событие unload. Каждый элемент управления, который вы добавляете на страницу, будет частью жизненного цикла страницы. Поэтому, если у вас есть элемент управления, который должен выполнить некоторую очистку, сам элемент управления должен обрабатывать любую возможную очистку сам по себе. Вам не нужно беспокоиться об этом, если элемент управления был добавлен на страницу и правильно следует принципу инкапсуляции.

Документация гласит, что вы должны использовать это даже "для окончательной очистки определенных элементов управления, таких как закрытие подключений к базе данных для элементов управления". Моя рекомендация - избегать события unload. Когда это возможно, выполняйте любой код очистки раньше, чем позже, поэтому используйте «использование», если можете. В некотором смысле это похоже на выбор между использованием «глобальной» переменной, а не локальной переменной, последняя предпочтительнее.

5 голосов
/ 01 апреля 2009

Я думаю, что это безопасно. Предполагается, что Page_Unload находится там, где выполняется очистка в жизненном цикле страницы. См. http://msdn.microsoft.com/en-us/library/ms178472.aspx, в котором говорится:

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

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

...