我的问题在这里:Stop program when thread finished?
我有一个窗口服务和一个aspx页面。在aspx页面中,我必须启动该服务。这个服务将运行一个线程,在线程完成后,它将停止服务。之后,我的aspx页面必须显示结果到屏幕。
所以,我必须:检查服务是否正在运行 - 启动服务 - 检查服务是否停止 - 将结果打印到屏幕。
目前,我的代码如下:
while(true){
if(isServiceStop){
MyService.Start();
while(true){
if(isServiceStop){
Print result;
break;
}
}
break;
}
}
这样,它会使我的CPU_Usage飙升,所以,我想知道是否有其他方法可以实现我的请求
答案 0 :(得分:1)
创建两个EventWaitHandle个对象以指示服务的状态:
private EventWaitHandle ServiceRunningEvent;
private EventWaitHandle ServiceStoppedEvent;
// in service startup
ServiceRunningEvent = new EventWaitHandle(False, EventResetMode.Manual, "RunningHandleName");
ServiceStoppedEvent = new EventWaitHandle(False, EventResetMode.Manual,
“ServiceStoppedEvent”);
// Show service running
ServiceStoppedEvent.Reset();
ServiceRunningEvent.Set();
当服务退出时,让它翻转值:
ServiceRunningEvent.Reset();
ServiceStoppedEvent.Set();
在ASP.NET应用程序中,您以相同的方式创建等待句柄,但不是设置它们的值,而是等待它们。所以:
// if service isn't running, start it and wait for it to signal that it's started.
if (!ServiceRunningEvent.WaitOne(0))
{
// Start the service
// and wait for it.
ServiceRunningEvent.WaitOne();
}
// now wait for the service to signal that it's stopped
ServiceStoppedEvent.WaitOne();
然而,我确实想知道为什么你要经常启动和停止服务。为什么不让服务一直运行,并在需要时发送信号呢?
答案 1 :(得分:0)
我发现该服务有WaitForStatus方法,所以我只需要使用下面的代码就可以了:
Myservice.WaitForStatus(ServiceControllerStatus.Stopped);