0

我正在使用以下函数来停止我的 Windows 服务(超时):

public int StopService()
{
    ServiceController service = new ServiceController(serviceName);
    try
    {
        TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds);
        service.Stop();
        service.WaitForStatus(ServiceControllerStatus.Stopped, timeout);              
        return 1;
    }
    catch (Exception ex)
    {
        logger.Log(LoggingLevel.Error,
                this.GetType().Name + ":" + MethodBase.GetCurrentMethod().Name,
                string.Format("{0}", ex.Message));
        return -1;
    }
}

我检查服务的状态。如果不是,ServiceControllerStatus.Stopped我调用这个函数。我已经测试并且当服务器的状态为RunningStopped时程序可以工作。但是我想知道当状态为其他状态时会发生什么,例如StopPendingStartPending等。如果我告诉我的服务在状态为上述状态之一时停止,Stop 命令是否仍能完成其工作?

4

2 回答 2

1

这取决于服务及其在调用 Stop() 时允许的内容。

在 Win32 级别,每个服务必须定期调用SetServiceStatus()以通知服务控制管理器 (SCM) 它将接受哪些命令。只有当服务明确表示允许该操作时,您对 Stop() 的调用才会成功。根据我的经验,处于挂起状态的服务通常不允许正常范围的操作,因此对 Stop() 的调用可能会失败。

请注意,很容易检查 C# 中允许的内容,如示例标题下的示例代码所示。您可以使用 CanStop() 作为对 Stop() 的调用的前缀,如果服务还没有完全准备好停止,则可以等待一段时间。突发事件比比皆是。

于 2014-10-15T16:51:50.817 回答
0

您可以像下面这样尝试,下面是 StopPending 的示例,

while (service.Status == ServiceControllerStatus.StopPending) //If it is stop pending, wait for it
                {
                    System.Threading.Thread.Sleep(30 * 1000); //  thread sleep for 30 seconds
                    service.Refresh(); // refreshing status

                    if (service.Status == ServiceControllerStatus.Stopped)
                    {
                        Comments = "Service " + serviceName + " stopped successfully. ";

                    }
                }

让我知道它是否有效。如果您有(有)任何更好的解决方案,还请提供

于 2015-06-25T12:04:14.047 回答