Правильный способ убить службу в C #, которая всегда будет восстановлена ​​SCM - PullRequest
0 голосов
/ 18 октября 2018

У нас есть служба, которая должна убить себя (причина: мы используем стороннюю библиотеку lib, которая непредсказуемо ведет себя в сценариях выключения ...).Иногда служба не перезапускается диспетчером управления службами Windows.Действия по восстановлению службы в SCM установлены на «Перезапуск службы» (для первого, второго и последующих сбоев).

Таким образом, мы убиваем наш сервис:

public static void TerminateProcess(string message)
{
   Log.ErrorFormat("Terminating Process becauses of: {0}", message);

   Process.GetCurrentProcess().Kill();
}

Кто-нибудь знает, является ли этот Process.GetCurrentProcess().Kill(); хорошим способом убить службу?

Я также читал некоторые темы, где была предложена следующая комбинация:

class MyService : ServiceBase
{
   void KillMe()
   {
      this.ExitCode = 1; // ServiceBase.ExitCode
      System.Environment.Exit(1);
   }
}

Я также нашелэтот поток stackoverflow , но в нем ничего не говорится о восстановлении службы.

Какой предпочтительный / безопасный способ убить службу, чтобы SCM перезапустил ее?

Thx

Ответы [ 2 ]

0 голосов
/ 18 октября 2018

Создайте единичный экземпляр вашего сервиса.И тогда вы можете остановить свою службу, используя метод stop ().


public partial class ABCService : ServiceBase
{
    public static ABCService ServiceInstance;

    private void InitService()
    {
        ServiceInstance = this;
    }
}

    public static void StopService()
    {
        if(ABCService.ServiceInstance != null)
        {
            ABCService.ServiceInstance.Stop();
        }
    }

И вы не хотите, чтобы перезапуск автоматически


    public static void ChangeServiceMode(bool serviceAutoEnable)
        {
            RegistryKey key     = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\NixService", true);

            if (key != null)
            {
                //Set service to manual / Automatic (Automatic = 2, manual = 3)
                int serviceMode = serviceAutoEnable ? 2 : 3;
                key.SetValue("Start", serviceMode, RegistryValueKind.DWord);
                key.Close();
            }
        }
    }

0 голосов
/ 18 октября 2018

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

ИМХО первый вариантболее практично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...