service.Status显示已停止,即使在服务管理器中显示为已启动

时间:2014-06-14 11:05:47

标签: c# windows-services

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

当启动许多服务时,它很好,但有一个服务我有问题。这是一个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;
}

1 个答案:

答案 0 :(得分:1)

您需要通过调用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();
  }