Как правильно остановить и запустить службу Windows при приостановке / возобновлении работы ПК?
Мне нужно остановить нашу службу Windows, когда компьютер выключен в режиме ожидания, и перезапустить его, когда компьютер возобновится. Как правильно это сделать?
4 ответа
Вы должны переопределить метод ServiceBase.OnPowerEvent.
protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
{
if (powerStatus.HasFlag(PowerBroadcastStatus.QuerySuspend))
{
}
if (powerStatus.HasFlag(PowerBroadcastStatus.ResumeSuspend))
{
}
return base.OnPowerEvent(powerStatus);
}
Перечисление PowerBroadcastStatus объясняет статусы питания. Кроме того, вам нужно установить свойство ServiceBase.CanHandlePowerEvent в true
,
protected override void OnStart(string[] args)
{
this.CanHandlePowerEvent = true;
}
Комментарий к Alex Filipovici Ответ отредактирован 16 мая '13 в 17:05:
CanHandlePowerEvent = true;
должен быть установлен в конструкторе
Установка в OnStart()
слишком поздно и вызывает это исключение:
Service cannot be started. System.InvalidOperationException: Cannot change CanStop, CanPauseAndContinue, CanShutdown, CanHandlePowerEvent, or CanHandleSessionChangeEvent property values after the service has been started.
at System.ServiceProcess.ServiceBase.set_CanHandlePowerEvent(Boolean value)
at foo.bar.OnStart(String[] args)
at System.ServiceProcess.ServiceBase.ServiceQueuedMainCallback(Object state)
Вместо того, чтобы остановить свой сервис, вы могли бы просто остановить обработку чем-то вроде...
Microsoft.Win32.SystemEvents.PowerModeChanged += this.SystemEvents_PowerModeChanged;
private void SystemEvents_PowerModeChanged(object sender, Microsoft.Win32.PowerModeChangedEventArgs e)
{
if (e.Mode == PowerModes.Suspend)
{
}
if (e.Mode == PowerModes.Resume)
{
}
}
Это одна из особенностей службы Windows.
Неисправность
Выключение выполняется автоматически при выключении компьютера. Не нужно ничего делать. Чтобы сделать какую-либо очистку, вам нужно переопределить ServiceBase
методы типа как OnPowerEvent
, образец
public class WinService : ServiceBase
{
protected override void OnStart(string[] args)
{
...
}
protected override void OnStop()
{
...
}
protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
{
...
}
}
Начните
Чтобы запустить сервис автоматически, вам нужно установить его на ServiceStartMode.Automatic
как здесь
[RunInstaller(true)]
public class WindowsServiceInstaller : Installer
{
private readonly ServiceProcessInstaller _process;
private readonly ServiceInstaller _service;
public WindowsServiceInstaller()
{
_process = new ServiceProcessInstaller
{
Account = ServiceAccount.LocalSystem
};
_service = new ServiceInstaller
{
ServiceName = "FOO",
StartType = ServiceStartMode.Automatic, // <<<HERE
Description = "Foo service"
};
Installers.Add(_process);
Installers.Add(_service);
}
}