在另一个方法中调用ServiceController.WaitForStatus会立即返回

时间:2015-06-23 07:42:34

标签: c# windows-services

我正在编写一个应用程序,以编程方式使用ServiceController启动/停止Windows服务。我有一个UI类,它有一些UI铃声和口哨声,还有一个启动和停止服务的Helper类。

在助手班:

void StopService()
{
    var controller = new ServiceController("MyService");

    if (controller.Status == ServiceControllerStatus.Running)
    {
      controller.Stop();
      controller.WaitForStatus(ServiceControllerStatus.Stopped, new TimeSpan(0, 0, 60));
    }
}

在UI类中:

Helper.StopService();

var controller = new ServiceController("MyService");

if (controller.Status == ServiceControllerStatus.Stopped)
{
    // Do some stuff
}
else
{
    // MyService not stopped. Explode!
}

问题是当服务停止时,Helper中的方法立即返回UI类中的调用者,而不等待服务到达停止(服务最终在大约5-10秒后停止)。如果我将启动/停止逻辑移动到UI类,事情就会正常。

我在这里犯了什么愚蠢的错误?

1 个答案:

答案 0 :(得分:0)

而不是ServiceController.WaitForStatus()您可以使用ServiceController Class中的MSDN上显示的延迟/刷新循环,但更好的方法可能是使用异步等待状态,如this answer中详述的那样

sc.Stop();
while (sc.Status != ServiceControllerStatus.Stopped)
{
    Thread.Sleep(1000);
    sc.Refresh();
}