如何使GUI等待Windows服务?

时间:2009-08-10 13:39:47

标签: c# windows-services

我写了一个Windows服务和一个gui。当然gui主要取决于服务。 gui有没有办法等待服务?有时我需要从gui重新加载服务配置并重新启动服务。

我在考虑两种解决方案: 1.使用while和sleep等待服务控制器状态改变(当然最简单的解决方案:P) 2.在某处实现INotifiPropertyChanged接口(这对于这个微不足道的问题看起来很复杂)。

我想知道有更优雅的方式吗?是否有某个我在某个地方遗失的事件?

5 个答案:

答案 0 :(得分:8)

ServiceController有一个WaitForStatus方法,在其中传递一个ServiceControllerStatus类型的参数。您可以像这样使用它:

controller.WaitForStatus(ServiceControllerStatus.Running);

答案 1 :(得分:1)

使用kernel Event object。当您启动这两个应用程序时,让它们创建或打开一个命名的Event对象,然后等待它。另一个可以发出信号,翻转状态,从而允许其他应用停止等待和运行。

答案 2 :(得分:1)

我可能会生成一个单独的thead来简单地轮询并查看服务控制器状态何时发生变化,当发生更改时终止此线程。然后,当您需要开始重新轮询时,只需重新生成线程

<强> Darknight

答案 3 :(得分:1)

使用EventWaitHandle。您的GUI可以在WaitHandle上等待,服务将设置它,这将触发GUI继续处理它开始等待之前的操作。没有轮询,没有循环,没有混乱。

This great article on C# threading可能是WaitHandles上信息的更好资源

答案 4 :(得分:0)

ServiceController mysqlServiceController = new ServiceController();
mysqlServiceController.ServiceName = "MySql";
var timeout = 3000;

myServiceController.Start();

try
{
    //Wait till the service runs mysql      
    ServiceController.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running, new TimeSpan(0, timeout, 0));
}
catch (System.ServiceProcess.TimeoutException)
{
    MessageBox.Show(string.Format("Starting the service \"{0}\" has reached to a timeout of ({1}) minutes, please check the service.", mysqlServiceController.ServiceName, timeout));
}