2009-04-06 2 views
71

Мне интересно, при каких обстоятельствах я должен вводить код инициализации приложения в Application_Start() против Init() в моем Global.asax файлах?Когда использовать Application_Start vs Init в Global.asax?

Различие между двумя не кажется мне очень очевидным, кроме Application_start сначала вызывается, затем Init().

  • Почему я должен использовать один над другим?
  • Действительно ли это имеет значение?
  • Какие изменения в состоянии приложения между двумя событиями?

До сих пор единственным реальным указателем я могу найти то, что IHttpModule имеется только Init() метод, так что если то, что я делаю, может в какой-то момент лучше подходит для реализации IHttpModule я должен использовать метод Init() из Global.asax, если ничего другого для согласованности.

ответ

79

От MSDN docs:

Методы Application_Start и Application_End специальные методы, которые не представляют HttpApplication события. ASP.NET называет их один раз для срока службы домена приложения, а не для каждого экземпляра HttpApplication.

Init:

Вызывается один раз для каждого экземпляра класса HttpApplication после того, как были созданы все модули.

UPDATE: если вам нужно убедиться, что определенный код вызывается только один раз в приложении. жизненный цикл, Application_Start - лучшее решение. Примеры: настройка log4net?

+3

Бит следующего вопроса: когда создан экземпляр HttpApplication? Я принимаю каждый раз, когда рабочий процесс перезапускается, и он будет содержать один экземпляр для каждого рабочего потока? – roryf

+1

@roryf - asp.net поддерживает пул экземпляров приложений, которые могут быть повторно использованы. Под обложками запросы обслуживаются с использованием пула потоков CLR, а входящие запросы будут поставлены в очередь за пределами определенного порога. Я сомневаюсь, что они инициализируют пул экземпляров приложения до этого порогового уровня, поскольку большинство сайтов не будут видеть такой трафик. Я подозреваю, что они создают пул с небольшим количеством экземпляров, а затем увеличивают размер пула по мере роста спроса. –

10

Да

Есть различия между ними. Событие Application_Start() вызывается только один раз, в то время как метод Init() вызывается каждый раз при создании экземпляра приложения.

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