0

作为我的问题:线程完成时停止程序

我有一个窗口服务和一个 aspx 页面。在 aspx 页面中,我必须启动服务。该服务将运行一个线程,线程完成后,它将停止该服务。之后,我的 aspx 页面必须在屏幕上显示结果。

所以,我必须:检查服务是否正在运行 - 启动服务 - 检查服务是否停止 - 将结果打印到屏幕上。

目前,我的代码是这样的:

while(true){
    if(isServiceStop){
         MyService.Start();
         while(true){
              if(isServiceStop){
                   Print result;
                   break;
              }
         }
         break;
    }
}

这样一来,我的 CPU_Usage 就会飙升,所以,我想知道是否有其他方法可以实现我的要求

4

2 回答 2

1

创建两个EventWaitHandle对象来指示服务的状态:

private EventWaitHandle ServiceRunningEvent;
private EventWaitHandle ServiceStoppedEvent;

// in service startup
ServiceRunningEvent = new EventWaitHandle(False, EventResetMode.Manual, "RunningHandleName");
ServiceStoppedEvent = new EventWaitHandle(False, EventResetMode.Manual,

"服务停止事件");

// 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();

但是,我确实想知道为什么您要如此频繁地启动和停止服务。为什么不让服务一直运行,并在需要它做事时发送信号呢?

于 2013-08-14T12:34:23.957 回答
0

I found that service have method WaitForStatus, so I only need to use below code and it work perfectly:

Myservice.WaitForStatus(ServiceControllerStatus.Stopped);
于 2013-08-15T02:40:55.700 回答