对已停止或具有其他状态的服务应用“停止”

时间:2014-10-15 08:07:18

标签: c# windows-services servicecontroller

我使用以下函数来停止我的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,我会调用此函数。 我已经测试过,当服务器的状态为正在运行已停止时,程序正常运行。但我想知道当状态是其他状态时会发生什么,例如 StopPending StartPending 等。如果我告诉我的服务停止状态是其中一个状态上面,Stop命令是否仍然可以正常工作?

2 个答案:

答案 0 :(得分:0)

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

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

请注意,很容易检查C#中允许的内容,如sample code under the Examples heading所示。您可以使用CanStop()为Stop()添加前缀,如果服务还没有准备好停止,可能需要等待一段时间。突发事件比比皆是。

答案 1 :(得分: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. ";

                    }
                }

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