Я столкнулся с ситуацией, когда развернул службу .Net (C #) на сервере Win 2008R2.Служба зависит от MSMQ.При выключении необходимо отправить пару быстрых сообщений перед завершением.Это прекрасно работает с событиями OnStop (), запускаемыми вручную, но когда сервер выключается и SCM вызывает OnShutdown (), я обнаружил, что MSMQ уже завершил работу и моя служба не может правильно очистить.Моему сервису нужно всего 2-5 секунд, чтобы работать.
Я понимаю (сейчас), что сервисные зависимости относятся только к запуску, так что это не помогает.Сегодня я потратил некоторое время, пытаясь выяснить, как зарегистрировать свой сервис, чтобы принимать новые (начиная с Vista) доступные события SERVICE_ACCEPT_PRESHUTDOWN и работать с функцией PreShutDownOrder (http://blogs.technet.com/b/askperf/archive/2008/02/04/ws2008-service-shutdown-and-crash-handling.aspx),, но это не поддерживается в ServiceBase, как реализовано внасколько я могу судить, это фреймворк.
Я пытался вручную установить его с помощью функции SetServiceStatus (), но, похоже, он не работает.
_serviceHandle = this.ServiceHandle;
SERVICE_STATUS serviceStatus = new SERVICE_STATUS();
serviceStatus.currentState = (int)State.SERVICE_RUNNING;
serviceStatus.controlsAccepted = (int)(ControlsAccepted.SERVICE_ACCEPT_PRESHUTDOWN | ControlsAccepted.SERVICE_ACCEPT_STOP);
serviceStatus.waitHint = 0;
serviceStatus.checkPoint = 0;
bool setStatus = SetServiceStatus(_serviceHandle, ref serviceStatus);
int error = Marshal.GetLastWin32Error();
Это возвращает статус ошибки 13, когда вы звоните GetLastError();
Есть какие-нибудь идеи о том, как подключиться к событиям предварительной очистки?