5

MSDN 说:

“ServiceMain 函数应该创建一个全局事件,在此事件上调用 RegisterWaitForSingleObject 函数,然后退出。这将终止正在运行 ServiceMain 函数的线程,但不会终止服务......”

那么问题来了:应该在ServiceMain函数内部创建一个新线程来执行服务代码,或者我可以简单地将服务设置为RUNNING状态并使用ServiceMain线程来运行服务代码?如果使用 ServiceMain 线程运行服务代码,SCM 将保持锁定状态,即使服务状态设置为 RUNNING?

4

2 回答 2

3

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

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

于 2013-02-16T02:44:31.820 回答
0

MSDN:“服务控制管理器 (SCM) 一直等到服务报告状态SERVICE_RUNNING。建议服务尽快报告此状态,因为在此期间系统中需要与 SCM 交互的其他组件将被阻止时间。”

控制调度程序创建一个新线程来执行服务的 ServiceMain 函数。ServiceMain 函数应执行以下任务。

5.. 执行服务任务,或者,如果没有待处理的任务,则将控制权返回给调用者。服务状态的任何变化都需要调用SetServiceStatus以报告新的状态信息。

这个示例中可以看出,您可以在 ServiceMain 函数中执行更复杂的初始化任务,例如创建额外的线程。

创建多线程服务的指南。

于 2013-02-16T06:47:12.683 回答