Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从相同的windows服务重新启动windows服务_C# - Fatal编程技术网

C# 从相同的windows服务重新启动windows服务

C# 从相同的windows服务重新启动windows服务,c#,C#,我正在尝试使用以下代码从同一windows服务重新启动windows服务: var psi = new ProcessStartInfo("net.exe", "stop " + serviceName); psi.WindowStyle = ProcessWindowStyle.Hidden; psi.UseShellExecute = true; psi.WorkingDirectory = En

我正在尝试使用以下代码从同一windows服务重新启动windows服务:

            var psi = new ProcessStartInfo("net.exe", "stop " + serviceName);
            psi.WindowStyle = ProcessWindowStyle.Hidden;
            psi.UseShellExecute = true;
            psi.WorkingDirectory = Environment.SystemDirectory;
            var st = Process.Start(psi);
            st.WaitForExit();

            psi = new ProcessStartInfo("net.exe", "start " + serviceName);
            psi.UseShellExecute = true;
            psi.WindowStyle = ProcessWindowStyle.Hidden;
            psi.WorkingDirectory = Environment.SystemDirectory;
            st = Process.Start(psi);
            st.WaitForExit();
它不起作用,但这是否可以从同一服务中实现


如果可能的话,那么有人能提出为什么这不起作用吗?

它不起作用,因为一旦到达中间位置,执行就会停止,因为父进程和子进程都会退出:

/* Running */            var psi = new ProcessStartInfo("net.exe", "stop " + serviceName);
/* Running */            psi.WindowStyle = ProcessWindowStyle.Hidden;
/* Running */            psi.UseShellExecute = true;
/* Running */            psi.WorkingDirectory = Environment.SystemDirectory;
/* st stops svc */       var st = Process.Start(psi);
/* both exit */          st.WaitForExit();

/* never reached */      psi = new ProcessStartInfo("net.exe", "start " + serviceName);
/* never reached */      psi.UseShellExecute = true;
/* never reached */      psi.WindowStyle = ProcessWindowStyle.Hidden;
/* never reached */      psi.WorkingDirectory = Environment.SystemDirectory;
/* never reached */      st = Process.Start(psi);
/* never reached */      st.WaitForExit();
在windows中配置服务,使其在出现故障时重新启动,然后按照@StevieB的建议执行不干净的退出

将服务配置为在出现故障时以1000毫秒的延迟重新启动:

sc failure serviceName reset= 60 actions= restart/1000

我不相信有一个干净的方法可以做到这一点。一旦停止该服务,该流程就不再用于启动它

一种稍脏的解决方案: 您可以将服务配置为在出现错误时重新启动(例如,在安装/注册时)

然后,当您希望以编程方式重新启动时,请让您的服务因错误而退出,例如,通过调用:

Environment.Exit(-1)


注意:如果有更简洁的方式以编程方式执行此操作,则运行服务的帐户将需要权限才能重新启动服务。

您遇到了死锁
net
正在等待您的服务结束,您正在使用
st.WaitForExit()
等待
net
结束

最后,
net
放弃等待并关闭。然后您再次调用
net
。但是您的服务从一开始就没有退出过,因此第二次
net
调用看到服务已经启动,并且什么也不做

最后,返回主服务事件循环并查看停止请求,然后服务退出


您应该能够使用上述命令编写批处理文件,调用它,然后返回到事件循环。然后,第一个
net
将等待服务停止,第二个
net
将再次启动它。

您期望得到什么,实际发生了什么,以及到目前为止您做了哪些故障排除工作?我期望服务重新启动。我不知道如何将net命令的输出重定向到文件,因此我不知道发生了什么。它不会停止svc。@dagda1:您遇到了死锁
net
正在等待您的服务结束,您正在使用
st.WaitForExit()
等待
net
结束。
Environment.FailFast("Service stopped because...")