Может ли служба Windows корректно завершить работу в течение нескольких часов? - PullRequest
7 голосов
/ 16 сентября 2011

У нас есть служба .NET Windows, которая переносит множество критически важных данных от А до Б транзакционным способом. Мы также должны убедиться, что все внешние компоненты, используемые в сервисе, правильно распределены и все очищено перед тем, как завершить работу сервиса. Это может занять часы! Причина этого в том, что службе требуется ждать обратного вызова внешнего компонента, который поступает через 2, 3 или 4 часа.

  1. Возможно ли Windows так долго ждать, пока служба отключение изящно?
  2. есть ли опции в сервисе, где я могу диктовать, что происходит, когда служба закрывается операционной системой, например, предотвращать отключение вообще?
  3. также, как еще один сценарий, что произойдет, если сервер должен перезагружать? Может ли он часами ждать службы?
  4. Существует ли ограничение на время, в течение которого ОС будет ждать службы, прежде чем ее убить?

Ответы [ 3 ]

7 голосов
/ 16 сентября 2011

Вы можете использовать CanStop, CanShutdown, CanHandlePowerEvent , чтобы получать уведомления о завершении работы компьютера и отвечать соответствующим образом.

Используйте метод ServiceBase.RequestAdditionalTime, чтобы запросить дополнительное время для завершения вашего потока:

protected override void OnShutdown() 
{
    base.RequestAdditionalTime(MaxTimeout);
    serviceCore.OnShutdown();
    Stop(); 
}

Если ваш OnShutdown () блокируется дольше 20 секунд (значение по умолчанию хранится в реестре HKEY_LOCAL_MACHINE \SYSTEM \ CurrentControlSet \ Control \ WaitToKillServiceTimeout), ваш сервис будет помечен как не отвечающий и уничтожен.

Есть хорошая запись в блоге от команды BCL на эту тему, которую я рекомендую.

4 голосов
/ 16 сентября 2011

Да, служба может останавливаться до завершения, но так ли это? Для этого в реестре есть значения тайм-аута. Какая ОС?

Я думаю, вам нужно отделить функцию обратного вызова от другого компонента или сохранить данные на диске и отправить их небольшими фрагментами. Что происходит при отключении питания? Или если кому-то надоело ждать и выключать?

Если данные критически важны, управляйте ими вне памяти и перезапускайте процесс. Это решит ваш длительный процесс выключения. Аналогично способ опроса компонента на предмет прогресса устраняет зависимость от блокировки.

0 голосов
/ 25 сентября 2013

Вы не можете использовать RequestAdditionalTime (MaxTimeout) внутри OnShutdown () ...

...