在ServiceMain上应该创build一个新的线程?

MSDN说:

“ServiceMain函数应该创build一个全局事件,在这个事件上调用RegisterWaitForSingleObject函数并退出,这将终止运行ServiceMain函数的线程,但不会终止服务…”

所以问题是:应该在ServiceMain函数中创build一个新的线程来执行服务代码,或者我可以简单地将服务设置为RUNNING状态并使用ServiceMain线程来运行服务代码? 如果使用ServiceMain线程运行服务代码,即使服务状态设置为RUNNING,SCM也将保持locking状态?

我不认为从MSDN执行该语句所描述的服务的方式是唯一可行的。 这将与http://msdn.microsoft.com/en-us/library/windows/desktop/bb540476(v=vs.85).aspx上的 MSDN服务示例相矛盾。 在这个例子中,服务在调用ServiceMain的同一个线程中等待事件。 这种方式可能更适合单线程工作的简单服务。

如果您选择使用RegisterWaitForSingleObject方法,则不必显式创建线程。 RegisterWaitForSingleObject的MSDN页面说:“新的等待线程是在需要时自动创建的。” 您必须打开服务将要监视的I / O通道,并在退出ServiceMain之前将其句柄绑定到线程池。

MSDN 说 :“服务控制管理器(SCM)等待,直到服务报告一个SERVICE_RUNNING的状态。建议服务尽快报告这个状态,因为系统中需要与SCM交互的其他组件将被阻塞这次。”

控制分派器创建一个新的线程来执行该服务的ServiceMain函数。 ServiceMain函数应执行以下任务。

5.执行服务任务,或者,如果没有待处理的任务,则将控制返回给调用者。 服务状态中的任何更改都会保证调用SetServiceStatus来报告新的状态信息。

从这个例子来看,你可以在ServiceMain函数内执行更复杂的初始化任务,例如创建其他线程。

创建多线程服务指南 。