Как правильно остановить и запустить службу 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);
    }
}
Другие вопросы по тегам