【问题标题】:Apply Stop on a service that is Stopped or has another state对已停止或具有其他状态的服务应用停止
【发布时间】:2014-10-15 08:07:18
【问题描述】:

我正在使用以下函数来停止我的 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 命令还能发挥作用吗?

【问题讨论】:

    标签: c# windows-services servicecontroller


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      你可以像下面这样尝试,下面是 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. ";
      
                          }
                      }
      

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 1970-01-01
        • 2015-09-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多