异步停止Windows服务

时间:2012-08-15 16:30:35

标签: c++ windows winapi service

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

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

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

是否有办法阻止/异步停止Windows服务?

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

SCM以序列化方式处理控制请求。如果任何服务正忙于处理控制请求,则ControlService()将被阻止,直到SCM可以处理新请求。这在the documentation中说明了很多:

  

SCM以串行方式处理服务控制通知   将等待一个服务完成处理服务控制   发送下一个之前的通知。因此,打电话给   如果任何服务繁忙,ControlService将阻止30秒   处理控制代码。如果繁忙的服务仍未返回   从超时器到期时的处理函数,ControlService   失败了ERROR_SERVICE_REQUEST_TIMEOUT。

答案 2 :(得分:1)

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

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

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