【问题标题】:Correct way to kill service in C#, to be always recovered by SCM在 C# 中终止服务的正确方法,始终由 SCM 恢复
【发布时间】:2018-10-18 09:18:39
【问题描述】:

我们有一个需要杀死自己的服务(原因:我们使用第三方库,它在关闭场景中具有不可预测的行为......)。有时,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 重新启动它?

谢谢

【问题讨论】:

    标签: c# windows service


    【解决方案1】:

    为您的服务创建一个单例实例。然后你可以使用 stop() 方法停止你的服务。

    公共部分类 ABCService : ServiceBase { 公共静态 ABCService 服务实例; 私人无效初始化服务() { 服务实例 = 这个; } } 公共静态无效停止服务() { 如果(ABCService.ServiceInstance != null) { ABCService.ServiceInstance.Stop(); } }

    你不希望自动重启

    公共静态无效 ChangeServiceMode(bool serviceAutoEnable) { RegistryKey key = Registry.LocalMachine.OpenSubKey("SYSTEM\\CurrentControlSet\\Services\\NixService", true); 如果(键!= null) { //将服务设置为手动/自动(自动 = 2,手动 = 3) 诠释 serviceMode = serviceAutoEnable ? 2:3; key.SetValue("开始", serviceMode, RegistryValueKind.DWord); 键.关闭(); } } }

    【讨论】:

      【解决方案2】:

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

      恕我直言,第一个选项更实用。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-06-05
        • 2019-02-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多