C# 服务状态显示已停止,即使在服务管理器中显示为已启动

C# 服务状态显示已停止,即使在服务管理器中显示为已启动,c#,windows-services,C#,Windows Services,我有一个控制台应用程序,可以在我开发时为我启动和停止大量服务 当启动许多服务时,这很好,但有一项服务我有问题。这是一个MySQL数据库服务。这是我的密码。我没有使用service.WaitForStatus,因此我可以做一些额外的日志记录。即使我在服务GUI中检查时,它会显示status started status STARTS started,但该服务仍会将状态显示为stopped var service = new ServiceController(serviceName);

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

当启动许多服务时,这很好,但有一项服务我有问题。这是一个MySQL数据库服务。这是我的密码。我没有使用
service.WaitForStatus
,因此我可以做一些额外的日志记录。即使我在服务GUI中检查时,它会显示status started status STARTS started,但该服务仍会将状态显示为stopped

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;
}

您需要通过调用刷新状态

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();
  }

即使您刷新服务GUI?耶,我先检查它是否已停止,然后运行我的应用程序刷新GUI,并显示已启动。对于服务状态,
sc query
命令显示了什么?它显示已停止。它好像不承认任何身份变化