Страницы

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

среда, 12 декабря 2018 г.

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

На мой взгляд, OnStart нужен для какой-то инициализации.
Зачем нужен метод OnStart, когда все можно добавить в конструктор службы?


Ответ

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

Поэтому, в конструкторе службы, также как и в методе Main, следует делать только те действия, которые могут быть сделаны быстро. Для долгих действий надо использовать OnStart. А очень долгие - надо выносить в отдельный поток и предусматривать прерывание их на середине.
Также следует помнить, что внезапно долгим может оказаться любой сетевой запрос, обращение к СУБД или к файлу по сетевому пути - причем их тайм-ауты по умолчанию превышают тайм-аут ожидания запуска процесса. Ни одно из этих действий нельзя делать в конструкторе.

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

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