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

C# 如何从服务内部退出Windows服务?,c#,.net,windows,windows-services,windows-server-2012,C#,.net,Windows,Windows Services,Windows Server 2012,我有一个Windows服务。启动时,它会检查是否有任何工作分配给它,如果没有,它就退出。问题是恢复机制设置为重新启动服务 如果服务合法崩溃,这是我想要的,但如果我自己以编程方式退出服务,则不是这样 到目前为止,我在下面尝试的一切都导致Windows自动重新启动服务: Thread th; protected override void OnStart(string[] args) { th = new Thread(new ThreadStart(StartMyService));

我有一个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);
}

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

忽略这是否是良好设计的问题,操作系统使用故障恢复操作的原因是服务出现故障

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


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

这不是任何人所期望的服务,也不是操作系统。当服务运行时,您希望它定期检查是否需要完成任何工作,而不必不断地停止和重新启动它。使用计时器。