如何从服务内部退出 Windows 服务?
How do I quit a Windows service from inside the service?
我有一个 Windows 服务。在启动时它会检查是否有任何工作分配给它 - 如果 none 有,它就会退出。问题是恢复机制设置为重新启动服务。
如果服务正常崩溃,这就是我想要的,但如果我自己以编程方式退出服务,则不是。
到目前为止,我在下面尝试的所有操作都导致 Windows 自动重启服务:
Thread th;
protected override void OnStart(string[] args)
{
th = new Thread(new ThreadStart(StartMyService));
th.Start();
}
private void StartMyService()
{
if (WorkAvailable()) {
InitWork();
} else {
this.ExitCode = 0; // no errors
Stop();
}
}
protected override void OnStop()
{
// dispose of things
try
{
if (th != null && th.ThreadState == ThreadState.Running)
th.Abort();
}
catch { }
Environment.Exit(this.ExitCode);
}
我尝试了不同的 ExitCode 值,但 Windows 总是会重新启动服务。我也试过 Environment.FailFast
得到相同的结果。我错过了什么?
忽略这是否是好的设计的问题,OS 使用故障恢复操作的原因是因为服务失败。
当您调用 Stop 时,运行时会将服务标记为正在停止。然后它调用 OnStop 方法。当 OnStop 方法 returns 它完成清理然后退出服务。如果这是可执行文件中的唯一服务,那么可执行文件也会退出。永远不需要自己退出进程。
当您调用 Environment.Exit(或 Environment.FailFast)时,您会导致服务可执行文件突然退出,而 ServiceControlManager 仍将其列为 运行,因此 OS非常正确地认为服务失败了。
我有一个 Windows 服务。在启动时它会检查是否有任何工作分配给它 - 如果 none 有,它就会退出。问题是恢复机制设置为重新启动服务。
如果服务正常崩溃,这就是我想要的,但如果我自己以编程方式退出服务,则不是。
到目前为止,我在下面尝试的所有操作都导致 Windows 自动重启服务:
Thread th;
protected override void OnStart(string[] args)
{
th = new Thread(new ThreadStart(StartMyService));
th.Start();
}
private void StartMyService()
{
if (WorkAvailable()) {
InitWork();
} else {
this.ExitCode = 0; // no errors
Stop();
}
}
protected override void OnStop()
{
// dispose of things
try
{
if (th != null && th.ThreadState == ThreadState.Running)
th.Abort();
}
catch { }
Environment.Exit(this.ExitCode);
}
我尝试了不同的 ExitCode 值,但 Windows 总是会重新启动服务。我也试过 Environment.FailFast
得到相同的结果。我错过了什么?
忽略这是否是好的设计的问题,OS 使用故障恢复操作的原因是因为服务失败。
当您调用 Stop 时,运行时会将服务标记为正在停止。然后它调用 OnStop 方法。当 OnStop 方法 returns 它完成清理然后退出服务。如果这是可执行文件中的唯一服务,那么可执行文件也会退出。永远不需要自己退出进程。
当您调用 Environment.Exit(或 Environment.FailFast)时,您会导致服务可执行文件突然退出,而 ServiceControlManager 仍将其列为 运行,因此 OS非常正确地认为服务失败了。