Что произойдет, если я остановлю службу Windows во время обработки запроса WCF?

5

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

  • 1
    Какая служба Windows? Это то, что вы написали? Это полностью зависит от того, как служба обрабатывает запрос на отключение. Это может быть написано для завершения текущей работы или нет.
  • 0
    Вы сами это проверили? Каков был результат?
Показать ещё 3 комментария
Теги:
service

1 ответ

4
Лучший ответ

Когда диспетчер управления службами остановит вашу службу,.Net ServiceBase устанавливает статус SERVICE_STOP_PENDING и вызывает ваш метод OnStop. То, что вы делаете с этим уведомлением, зависит от вас. В идеале у вас будет какой-то механизм, например, использование CancellationToken для уведомления о любых ваших потоках, которые в настоящее время работают, чтобы их нужно было завернуть и выйти как можно быстрее. В вашем случае это может быть связано с закрытием службы ServiceHost. Ваш метод OnStop должен подождать, пока он не узнает, что это было выполнено (присоединяясь к потокам, например), прежде чем вернуться. Есть способы уведомить диспетчер управления службами, что вам нужно больше времени, или просто сообщить ему, что вы получили уведомление, и вы активно работаете над остановкой (SERVICE_STATUS dwcheckpoint).

Если вы только что вернетесь сразу же из своего OnStop (или не утруждайтесь его внедрением), я думаю, что ваши потоки обслуживания будут принудительно завершены быстро. Я не знаю точно, потому что я никогда не пробовал это. Я всегда реализую OnStop и возвращаюсь только после того, как все очищено. Если вы реализуете OnStop, но заходите очень долго, чтобы не допустить, чтобы диспетчер управления службами знал, что вы работаете над ним, тогда он будет ждать немного (20 секунд для остановки службы... это параметр реестра), а затем прекратите свои потоки.

Правильная вещь - написать свою услугу, чтобы она начиналась быстро, быстро останавливалась, приостанавливалась и продолжалась быстро и т.д. Как видно из приведенного выше описания, именно то, что происходит в вашем случае, полностью зависит от того, как ваша служба был реализован. Только у вас есть информация, чтобы "знать наверняка".

http://blogs.msdn.com/b/bclteam/archive/2009/02/19/in-depth-how-net-managed-services-interact-with-the-servicecontrolmanager-scm-kim-hamilton.aspx

Ещё вопросы

Сообщество Overcoder
Наверх
Меню