服务.状态显示停止,即使在服务管理器中它显示为启动

本文关键字:服务 显示 管理器 启动 状态 | 更新日期: 2023-09-27 18:08:40

我有一个控制台应用程序,在我开发时为我启动和停止大量服务。

当启动许多服务时,它很好,但有一个服务我有问题。它是一个MySQL数据库服务。这是我的代码。我没有使用service.WaitForStatus,这样我可以做一些额外的记录。服务只是显示状态为停止,即使当我在服务GUI中检查它显示状态启动。

var service = new ServiceController(serviceName);                            
switch (service.Status)
{
    case ServiceControllerStatus.Stopped:
         service.Start();
         var servicesStarted = false;
         while (!servicesStarted)
         {      
             sb.Append("Status of : ");
             sb.Append(serviceName);
             sb.Append(" is ");
             sb.Append(service.Status);
             log.Info(sb.ToString());
             sb.Clear();
             servicesStarted = service.Status == ServiceControllerStatus.Running;
             Thread.Sleep(500);
         }
         break;
}

服务.状态显示停止,即使在服务管理器中它显示为启动

需要调用service.Refresh()刷新状态

.net包装器缓存来自服务的状态信息,可能是因为每次查询数据的成本很高。

方法WaitForStatus()为你照顾刷新,但如果你不想使用它,你必须手动刷新。

WaitForStatus实际使用的代码是

  DateTime utcNow = DateTime.UtcNow;
  this.Refresh();
  while (this.Status != desiredStatus)
  {
    if (DateTime.UtcNow - utcNow > timeout)
      throw new System.ServiceProcess.TimeoutException(Res.GetString("Timeout"));
    Thread.Sleep(250);
    this.Refresh();
  }