我正在尝试控制应用程序中的服务。通过StartService(MSDN)启动服务工作正常,服务需要大约10秒才能启动,但在调用StartService之后,它立即将控件返回给主应用程序。
但是,当通过ControlService(MSDN)停止服务时 - AFAIK没有StopService - 它会阻止主应用程序完成整个时间,直到服务停止,大约需要10秒。
Start: StartServiceW( handle, 0, NULL)
Stop: ControlService( handle, SERVICE_CONTROL_STOP, status )
是否有办法阻止/异步停止Windows服务?
答案 0 :(得分:1)
我可能会考虑在新线程中停止服务。这将消除主线程的阻塞。
答案 1 :(得分:1)
SCM以序列化方式处理控制请求。如果任何服务正忙于处理控制请求,则ControlService()
将被阻止,直到SCM可以处理新请求。这在the documentation中说明了很多:
SCM以串行方式处理服务控制通知 将等待一个服务完成处理服务控制 发送下一个之前的通知。因此,打电话给 如果任何服务繁忙,ControlService将阻止30秒 处理控制代码。如果繁忙的服务仍未返回 从超时器到期时的处理函数,ControlService 失败了ERROR_SERVICE_REQUEST_TIMEOUT。
答案 2 :(得分:1)
该服务正在其控制处理程序例程中进行清理。对于只需要几分之一秒退出的服务,这是可以的,但是需要十秒钟的服务肯定应该设置STOP_PENDING状态,然后异步清理。
如果这是您自己的服务,您应该纠正这个问题。我首先要确保所有的清理工作都是必要的;例如,在停止之前不需要释放内存(除非服务与其他服务共享进程)。如果清理真的不够快,请启动一个单独的线程(或发出主线程信号)来执行服务关闭并将服务状态设置为STOP_PENDING。
如果这是其他人的服务,唯一的解决方案是从单独的线程或子流程发出停止请求。