我正在编写一个应用程序,以编程方式使用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类,事情就会正常。
我在这里犯了什么愚蠢的错误?
答案 0 :(得分:0)
而不是ServiceController.WaitForStatus()您可以使用ServiceController Class中的MSDN上显示的延迟/刷新循环,但更好的方法可能是使用异步等待状态,如this answer中详述的那样
sc.Stop();
while (sc.Status != ServiceControllerStatus.Stopped)
{
Thread.Sleep(1000);
sc.Refresh();
}