多线程服务

服务控制管理器 (SCM) 通过将服务控制事件发送到服务的控制处理程序例程来控制服务。 服务必须及时响应控制事件,以便 SCM 能够跟踪服务的状态。 此外,服务的状态必须与 SCM 接收的状态的说明相匹配。

由于服务与 SCM 之间的这种通信机制,在服务中使用多个线程时必须小心。 当服务被 SCM 指示停止时,它必须等待所有线程退出,然后向 SCM 报告服务已停止。 否则,SCM 可能会对服务的状态感到困惑,并且可能无法正确关闭。

需要通知 SCM 服务正在响应停止控制事件,并且正在停止服务时进行进度。 如果服务在上一次调用 SetServiceStatus中指定的时间(等待提示)内响应(通过 SetServiceStatus),并且检查点将更新为大于上一次调用 SetServiceStatus中指定的检查点。

如果服务向 SCM 报告服务已在所有线程退出之前停止,则 SCM 可能会将此解释为矛盾。 这可能会导致服务无法停止或重启的状态。