2013-06-25 3 views
2

Я создал службу Windows с C# 2010. Проблема в том, что при выключении компьютера служба не успевает остановиться, а onstop не всегда выполняется. Я говорю не всегда, потому что когда-то ему удается остановиться. Я попытался использовать уведомления о предварительном завершении Windows, которые были введены в Vista, однако результаты лучше, но не абсолютны.Служба Windows C# не всегда останавливается при завершении работы

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

+0

Почему у вашего обслуживания нет времени для остановки? Можете ли вы изменить сервис так, чтобы он был готов быстрее остановиться? – dasblinkenlight

+0

Мой сервис делает только одно: on_stop. Он обновляет запись на сервере sql. Требуется несколько миллисекунд :) – apant

+2

Вы уверены, что ваш сервис не застрял, делая что-то еще, тем самым не получив событие из Windows? –

ответ

6

Согласно http://msdn.microsoft.com/en-us/library/windows/desktop/ms685149(v=vs.85).aspx, служба обычно имеет около 20 секунд, чтобы отключиться, прежде чем система откажется и все равно выключится.

Вы могли иметь возможность отправлять сообщения STOP_PENDING обратно, если ваша служба требует больше времени, чтобы закрыть, но даже тогда вы ограничены около 125 секунд, прежде чем система цифры вы никогда не собираетесь закрыть, и вытаскивает коврик из-под тебя.

В C# у вас будет ваш служебный вызов RequestAdditionalTime во время выключения. Опять же, нет никакой гарантии, что вы получите дополнительное время, но можете попросить об этом. Помните, однако, если вы попросите больше времени, вам лучше сделать это до истечения этого времени, или вы можете попросить больше. Но в конце концов система будет выключит вас (опять же, возможно, менее чем за 2 минуты).

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

+0

Я быстро выключился. Несколько миллисекунд ... – apant

0

В своем классе услуг, полученных от ServiceBase, в режиме вытеснения OnStop вы можете запросить дополнительное время:

base.RequestAdditionalTime(1000 * 60 * 2); 
+0

Я попробую завтра. Я хочу, чтобы это решение ... – apant

+0

Также добавьте его в свой 'OnShutdown'. –

+0

Она до сих пор не всегда работает :(Где именно я должен поставить эту строку Мой OnStop является fillowing – apant

1

Это может быть ответом для вас (и для кого-то, кто ищет тот же ответ): Why doesn't the RequestAdditionalTime() method work on restart in Vista/7?:

... Suppose Windows allows 13 seconds for all services to shutdown. Some other service takes 12 seconds of cpu time (so other services can't execute during that time) and finally shuts down. That leaves 1 second for all the rest. Windows is going to kill them.

Это причина, по которой иногда ее иногда отключает, иногда нет.

К слову, Vista имеет 20 секунд. для убийства сервисов, W7 имеет 12 сек. и W8 - 5 сек.

+0

Хорошо. Интересно, есть ли способ преодолеть это ограничение и заставить окна ждать, пока эта служба остановится ... – apant

+0

PreShutdown может блокировать выключение системы, а сигнал SENS Logoff может блокировать систему. – Vizor