多线程服务

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

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

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

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