Когда использовать Application_Start против Init в Global.asax?

79

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

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

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

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

Рориф
источник

Ответы:

89

Из документов MSDN :

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

В этом:

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

ОБНОВЛЕНИЕ: если вам нужно убедиться, что определенный код вызывается только один раз в приложении. жизненного цикла, Application_Start - лучшее решение. Примеры: настройка log4net?

Игорь Брейц
источник
4
Еще один вопрос: когда создается экземпляр HttpApplication? Я предполагаю, что каждый раз при перезапуске рабочего процесса он будет содержать по одному экземпляру для каждого рабочего потока?
roryf
2
@roryf - asp.net поддерживает пул экземпляров приложений, которые можно использовать повторно. По сути, запросы обслуживаются с помощью пула потоков CLR, а входящие запросы будут помещаться в очередь после определенного порога. Я сомневаюсь, что они инициализируют пул экземпляров приложения до этого порогового уровня, поскольку большинство сайтов не увидят такой трафик. Я подозреваю, что они создают пул с небольшим количеством экземпляров, а затем увеличивают размер пула по мере роста спроса.
Joel Fillmore
12

да

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

Дэвид Гардинер
источник