MSDN说:
“ServiceMain函数应创建一个全局事件,在此事件上调用RegisterWaitForSingleObject函数,然后退出。这将终止运行ServiceMain函数的线程,但不会终止服务...”
所以问题是:应该在ServiceMain函数内创建一个新的Thread来执行服务代码,或者我可以简单地将服务设置为RUNNING状态并使用ServiceMain线程来运行服务代码?如果ServiceMain线程用于运行服务代码,SCM将保持锁定状态,即使服务状态设置为RUNNING?
答案 0 :(得分:2)
我认为从MSDN实现该语句所描述的服务的方式并不是唯一可行的方法。这与http://msdn.microsoft.com/en-us/library/windows/desktop/bb540476(v=vs.85).aspx的MSDN服务示例相矛盾。在该示例中,服务等待调用ServiceMain的同一线程中的事件。对于使用单个线程工作得很好的简单服务,这种方式可能更好。
如果选择使用RegisterWaitForSingleObject方式,则不必显式创建线程。 RegisterWaitForSingleObject的MSDN页面说:“在需要时会自动创建新的等待线程。”您必须打开服务将要监视的I / O通道,并在退出ServiceMain之前将其句柄绑定到线程池。
答案 1 :(得分:0)
MSDN says:“服务控制管理器(SCM)等待服务报告状态为SERVICE_RUNNING
。建议服务尽快报告此状态,如同其他组件一样在此期间,需要与SCM交互的系统将被阻止。“
控制调度程序创建一个新线程来执行服务的ServiceMain函数。 ServiceMain函数应执行following任务。
5 ..执行服务任务,或者,如果没有待处理任务,则将控制权返回给调用者。服务状态的任何变化都需要保证 致电
SetServiceStatus
报告新状态信息。
从this示例开始,您可以在ServiceMain函数中执行更复杂的初始化任务,例如创建其他线程。
创建Multithreaded Services的指南。