我有一个控制台应用程序,可以在我开发时为我启动和停止大量服务。
当启动许多服务时,它很好,但有一个服务我有问题。这是一个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;
}
答案 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();
}