Application_Start по сравнению с OnInit по сравнению с конструктором

Я пошел раунды с этим с тех пор, как я начал программировать классический ASP 12 (или так) несколько лет назад, и я никогда не находил отличное решение, потому что архитектура ASP и ASP.NET всегда была болотом плохих методов, волшебство совместно использовало одиночные элементы и т.д. Моя самая большая проблема с HttpApplication объект с его событиями непримечательного события (Application_Start, Application_End, и т.д.).

Если Вы хотите сделать материал однажды для всей продолжительности жизни приложения HTTP, Application_Start очевидное место состоит в том, чтобы сделать это.Правильно? Не точно. Во-первых, это не событие по сути, это - волшебное соглашение о присвоении имен, которое при сопровождении заставляет метод быть названным однажды на AppDomain, созданный IIS.

Помимо волшебных соглашений о присвоении имен, являющихся ужасной практикой, я начал думать, что это могла бы быть причина, там не существуют такая вещь как a Start событие на HttpApplication объект. Таким образом, я экспериментировал с событиями, которые действительно существуют, такой как Init. Ну, это не действительно событие также, это - переопределяемый метод, который является следующей лучшей вещью.

Кажется что Init() метод называют для каждого инстанцирования HttpApplication объект, который происходит много несколько раз на AppDomain. Это означает, что я мог бы также просто вставить свою логику запуска HttpApplication конструктор объекта.

Теперь мой вопрос, почему я не должен помещать свою логику запуска в конструктора? Почему делает даже Init() существуйте и сделайте я должен заботиться о Application_Start? Если я делаю, может любой объяснять, почему нет никакого надлежащего события или переопределяемого метода для этого псевдособытия в HttpApplication объект?

И может любой объяснять мне почему в типичном приложении ASP.NET, 8 экземплярах моего HttpApplication создаются (который вызывает конструктора и Init работать так же, как много раз, конечно; это может быть смягчено с блокировкой и общей статической названной булевской переменной initialized) когда мое приложение только имеет единственный AppDomain?

7
задан Asbjørn Ulsberg 1 June 2011 в 09:07
поделиться

2 ответа

Для каждого параллельного запроса создается один объект HttpApplication. То есть каждый поток, создаваемый ASP.NET, получает собственный экземпляр HttpApplication. Экземпляры повторно используются для последующих запросов так же, как потоки повторно используются из пула потоков.

Используйте метод Init для инициализации полей экземпляра в HttpApplication, поскольку они будут инициализированы только в первом экземпляре, если это будет выполнено в событии Application_Start.

0
ответ дан 7 December 2019 в 07:39
поделиться

Время выполнения Asp.Net хранит пул объектов HttpApplication. Каждый .aspx запрос обрабатывается одним объектом, который выделяется из пула (8 объектов в вашем случае).

Ответ на ваш вопрос: событие Application_Start действительно вызывается, но только для первого экземпляра HttpApplication, а не для последующих, поэтому вы можете быть уверены, что оно вызывается ровно один раз при запуске вашего приложения или перезапуске пула приложений IIS. Так же как и событие Application_OnEnd (последний экземпляр)

Между тем, Init() и Dispose() вызываются на каждом экземпляре объекта HttpApplication. Это будет вызываться на каждом экземпляре, т.е. на каждом запросе.

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

Надеюсь, я ответил на ваш вопрос.

4
ответ дан 7 December 2019 в 07:39
поделиться
Другие вопросы по тегам:

Похожие вопросы: