Страницы

Поиск по вопросам

воскресенье, 29 декабря 2019 г.

В чем смысл OnStart, когда все можно запихать в конструктор службы?

#c_sharp #net #service


На мой взгляд, OnStart нужен для какой-то инициализации.

Зачем нужен метод OnStart, когда все можно добавить в конструктор службы?
    


Ответы

Ответ 1



Запуск службы в отдельном процессе происходит так: Сначала запускается процесс. Процесс считается запущенным, когда вызван метод ServiceBase.Run Если процесс долго не запускается (тайм-аут там стоит 3 или 5 секунд) - винда прекращает запуск службы и переводит службу в режим останова. При этом не отрабатывает автоматический перезапуск, а в системных логах - невнятная ошибка. Также, пока процесс не запущен, диспетчер служб не имеет возможности выдавать службе никаких команд - что с точки зрения администратора может выглядеть как крайняя степень глючности. Потом запускается служба. Служба считается запущенной когда отработал метод OnStart. Этого события система ждет дольше - тайм-аут по умолчанию там 30 секунд. Кроме того, всегда можно запросить дополнительное время с помощью метода RequestAdditionalTime Пока служба запускается - она находится в состоянии, которое так и называется - "Запускается". Если служба не успела или не смогла запуститься - это событие отрабатывается системой куда адекватнее. Поэтому, в конструкторе службы, также как и в методе Main, следует делать только те действия, которые могут быть сделаны быстро. Для долгих действий надо использовать OnStart. А очень долгие - надо выносить в отдельный поток и предусматривать прерывание их на середине. Также следует помнить, что внезапно долгим может оказаться любой сетевой запрос, обращение к СУБД или к файлу по сетевому пути - причем их тайм-ауты по умолчанию превышают тайм-аут ожидания запуска процесса. Ни одно из этих действий нельзя делать в конструкторе.

Ответ 2



Ох, давно дело было. Если мне память не изменяет, то с OnStart начинается непосредственное выполнение службой действий, какие тебе нужны. А конструктор он для инициализации именно. Так же OnStart способен принять аргументы, которые могут сконфигурировать выполнение службы. Прошу прощения за неточность, но так же OnStart является методом жизненного цикла, и по логике должен вызываться в самый подходящий момент для запуска службы. Есть ли в этом разница с конструктором или нет - не могу с уверенностью сказать, но жизненный цикл вообще для таких вещей и служит. UPD: Конструктор службы вызывается единожды при иницализации, в дальнейшем служба может быть запущена с вызовом OnStart, остановлена с помощью OnStop и еще пара методов для рабы с приостановкой OnPause и OnContinue. Разница между конструктором и OnStart проявляется так же в том, что конструктор не вызывается после повторного запуска, сразу же вызывается метод OnStart, который должен инициализировать необходимые для работы ресурсы и запустить производимые службой действия. Вот тут https://msdn.microsoft.com/ru-ru/library/system.serviceprocess.servicebase(v=vs.110).aspx все очень хорошо описано.

Комментариев нет:

Отправить комментарий