2012-01-24 2 views
4

Я использую временную базу данных в проекте, который расположен на Application_End:Application_End называют слишком рано/часто

protected void Application_End() { 
    if (_db != null) _db.Dispose(); 
} 

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

Не следует использовать приложение_End только при завершении сеанса или после определенного количества простоя?

Может ли кто-нибудь сказать мне, как я могу быть уверенным, что Application_End вызывается только тогда, когда я действительно закончил использование приложения?

ответ

10

Проблема заключается в том, что Application_End, кажется, называется часто в то время как я просматривал мой веб-проекта

Это происходит, когда AppDomain выгружается. Хотя вы отлаживаете это будет каждый раз, когда вы перекомпилируете свой проект, что является нормальным, потому что каждый раз, когда вы перекомпилируете сборку в папке bin, регенерируется, и ASP.NET просто перерабатывает домен приложения.

При развертывании приложения в IIS это произойдет реже, только когда IIS решит переработать приложение. Это может произойти при разных обстоятельствах: определенный период неактивности, CPU порогов/памятей достигаются, ...

не должен Application_End только называться, когда сеанс закончился или после определенного количества времени простоя ?

No, Application_End не имеет ничего общего с сеансами пользователя. Он называется в конце жизни домена приложения.

Может кто-нибудь сказать мне, как я могу быть в состоянии гарантировать, что Application_End называется только тогда, когда я на самом деле закончил с помощью приложения?

В этом случае: Application_End вызывается средой выполнения ASP.NET, когда домен приложения готов к выгрузке.

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

+0

Даже из режима отладки моя база данных находится между редактированием объекта и перенаправлением на индекс, не отображая никаких изменений. вы могли бы предложить что-нибудь еще, что я мог бы сделать, чтобы остановить базу данных, которая была бы удалена по тому, что, кажется, является каждым действием, которое я называю? – DevDave

+2

@Tyler, я бы предложил вам использовать постоянную базу данных. Базы данных в памяти отлично подходят для модульного тестирования, но совершенно бесполезны в реальном приложении. –

Смежные вопросы