我写了一个Windows服务和一个gui。当然gui主要取决于服务。 gui有没有办法等待服务?有时我需要从gui重新加载服务配置并重新启动服务。
我在考虑两种解决方案: 1.使用while和sleep等待服务控制器状态改变(当然最简单的解决方案:P) 2.在某处实现INotifiPropertyChanged接口(这对于这个微不足道的问题看起来很复杂)。
我想知道有更优雅的方式吗?是否有某个我在某个地方遗失的事件?
答案 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));
}