我们有一个需要杀死自己的服务(原因:我们使用了第三方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
答案 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(); } } }