如何从服务内部退出 Windows 服务?

Ang*_*ker -1 .net c# windows windows-services windows-server-2012

我有一个 Windows 服务。在启动时,它会检查是否有任何工作分配给它——如果没有,它就会退出。问题是恢复机制设置为重启服务。

在此处输入图片说明

如果服务合法崩溃,这就是我想要的,但如果我自己以编程方式退出服务,则不是。

到目前为止,我在下面尝试的所有操作都导致 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);
}
Run Code Online (Sandbox Code Playgroud)

我尝试了不同的 ExitCode 值,但 Windows 总是重新启动服务。我也试过Environment.FailFast同样的结果。我错过了什么?

Ste*_*tin 5

忽略这是否是好的设计问题,操作系统使用故障恢复操作的原因是因为服务失败。

当您调用 Stop 时,运行时会将服务标记为正在停止。然后它调用 OnStop 方法。当 OnStop 方法返回时,它完成清理,然后退出服务。如果这是可执行文件中的唯一服务,则可执行文件也会退出。永远不需要自己退出该过程。

当您调用 Environment.Exit(或 Environment.FailFast)时,您会导致服务可执行文件突然退出,而 ServiceControlManager 仍将其列为正在运行,因此操作系统非常正确地认为该服务已失败。