异步停止Windows服务
我试图控制应用程序内的服务。通过StartService启动服务(MSDN)工作正常,该服务需要大约10秒才能启动,但在调用StartService之后,它立即将控制权返回给主应用程序。异步停止Windows服务
但是,当通过ControlService停止服务时(MSDN) - AFAIK没有停止服务 - 它会阻塞主应用程序一段时间,直到服务停止,这大约需要10秒。
Start: StartServiceW(handle, 0, NULL)
Stop: ControlService(handle, SERVICE_CONTROL_STOP, status)
有没有一种非阻塞/异步停止Windows服务的方法?
我可能会考虑在新线程中停止服务。这将消除您的主线程阻塞。
SCM以序列化的方式处理控制请求。如果任何服务忙于处理控制请求,则ControlService()
将被阻止,直到SCM可以处理新的请求。这在the documentation表述为多:
单片机在处理业务控制的通知串行方式,它 将等待一个服务发送下一个之前完成处理业务控制 通知。因此,如果有任何服务忙于处理控制代码,012xx将致电 ControlService将阻塞30秒。如果超时过期时,忙服务仍未从其处理函数返回 ,则ControlService 将失败,并返回ERROR_SERVICE_REQUEST_TIMEOUT。
谢谢,我已经读过。除我以外没有其他控制要求,所以我认为这不适用于此,或者? – OnTheFly 2012-08-15 20:47:12
“如果** ANY **服务忙于处理控制代码,则对ControlService的调用将阻塞30秒”,而不仅仅是您的服务。 – 2012-08-16 18:46:45
该服务正在清理其控制处理程序例程。对于只需要几分之一秒退出的服务而言,这是可以的,但是需要十秒钟的服务应该确定将状态设置为STOP_PENDING,然后异步清理。
如果这是您自己的服务,您应该纠正该问题。我首先确保所有的清理工作都是非常必要的,例如,在停止之前不需要释放内存(除非服务与其他服务共享进程)。如果清理速度确实不够快,请启动一个单独的线程(或通知主线程)以执行服务关闭并将服务状态设置为STOP_PENDING。
如果这是他人的服务,唯一的解决方案是从单独的线程或子进程发出停止请求。
谢谢。我已经设置了SERVICE_STOP_PENDING,但是ControlService阻塞了,直到SERVICE_STOPPED。太糟糕了...... – OnTheFly 2012-08-17 08:53:39
将状态设置为SERVICE_STOP_PENDING后服务控制例程是否退出?你能显示代码吗? – 2012-08-18 03:26:07
你是否尝试从线程调用它?将阻塞呼叫转变为非阻塞呼叫的经典方法... – 2012-08-15 16:35:21
我不知道如何,但'sc'命令允许您停止服务而不会阻塞它。尝试寻找有趣的API函数。 – wilx 2012-08-15 16:38:29
有没有一种特定的服务是以这种方式表现的,还是所有这些服务?我的猜测是有问题的服务没有正确响应STOP请求。 – 2012-08-15 22:37:13