Application_End вызывается слишком рано / часто - PullRequest
4 голосов
/ 24 января 2012

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

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

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

Разве Application_End не вызывается только после завершения сеанса или после определенного периода простоя?

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

1 Ответ

11 голосов
/ 24 января 2012

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

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

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

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

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

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

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

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

...