3

我正在尝试控制应用程序中的服务。通过 StartService ( MSDN ) 启动服务工作正常,服务需要大约 10 秒才能启动,但在调用 StartService 后,它会立即将控制权交还给主应用程序。

但是,当通过 ControlService ( MSDN ) 停止服务时 - AFAIK 没有 StopService - 它会完全阻塞主应用程序,直到服务停止,这大约需要 10 秒。

Start: StartServiceW( handle, 0, NULL)
Stop: ControlService( handle, SERVICE_CONTROL_STOP, status )

有没有办法非阻塞/异步停止 Windows 服务?

4

3 回答 3

1

该服务正在其控制处理程序例程中进行清理。这对于只需要几分之一秒即可退出的服务来说是可以的,但是需要十秒的服务肯定应该设置状态为 STOP_PENDING 然后异步清理。

如果这是您自己的服务,您应该纠正该问题。我首先要确保所有的清理工作都是必要的;例如,在停止之前不需要释放内存(除非服务与其他服务共享进程)。如果清理速度确实不够快,请启动一个单独的线程(或向您的主线程发出信号)以执行服务关闭并将服务状态设置为 STOP_PENDING。

如果这是其他人的服务,唯一的解决方案是从单独的线程或子进程中发出停止请求。

于 2012-08-16T20:49:56.713 回答
1

我可能会考虑在新线程中停止服务。这将消除主线程的阻塞。

于 2012-08-15T16:38:18.757 回答
1

SCM 以串行方式处理控制请求。如果任何服务正忙于处理控制请求,ControlService()将被阻塞,直到 SCM 可以处理新请求。这在文档中有很多说明:

SCM 以串行方式处理服务控制通知——它将等待一个服务完成对服务控制通知的处理,然后再发送下一个服务控制通知。因此,如果任何服务正忙于处理控制代码,对 ControlService 的调用将阻塞 30 秒。如果超时到期时繁忙的服务仍未从其处理函数返回,则 ControlService 将失败并显示 ERROR_SERVICE_REQUEST_TIMEOUT。

于 2012-08-15T19:02:14.900 回答