正确的方法来终止C#中的服务,始终由SCM恢复

时间:2018-10-18 09:18:39

标签: c# windows service

我们有一个需要杀死自己的服务(原因:我们使用了第三方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 thread,但是它没有说明有关服务恢复的任何内容。

杀死服务以使SCM重新启动它的首选/安全方法是什么?

Thx

2 个答案:

答案 0 :(得分:0)

我认为有必要了解:在什么情况下有必要禁用该服务。 您描述的第一种方法允许您从第三方代码库中终止服务。第二种选择是在服务本身中,但是我认为最后一种选择是无法实现的,因为出现了一个问题:服务应该在什么情况下杀死自己?

恕我直言,第一种选择更实用。

答案 1 :(得分:0)

使服务成为单例实例。然后,您可以使用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();
            }
        }
    }