0

服务控制管理器 (SCM) 对服务上的方法调用做出什么保证?

它是否保证不会出现以下情况?

  • 服务停止时的 OnStart/OnPause/OnContinue
  • 服务暂停时的 OnStart/OnPause
  • 服务运行时 OnStop/OnContinue
  • 在命令方法已被执行时调用的任何命令方法
    • OnStart 而 OnStart 已经在执行
    • OnPause 执行时的 OnStop

到目前为止,我发现的最佳参考似乎表明确实做出了这些保证,但我发现的文档中唯一的参考非常模糊,所以我试图找到更好的参考。

这是 MSDN 论坛上的一个帖子,它说 SCM 确保状态是一致的,或者“至少我从来没有发现 [如果服务未运行或暂停,SCM 发送停止请求] 可能发生的情况”。

这是迄今为止我在文档中找到的最佳参考:

这些方法 [OnStart/OnStop/etc.] 表示服务在其生命周期中经历的状态;服务从一种状态转换到另一种状态。例如,在调用 OnStart 之前,您永远不会让服务响应 OnContinue 命令。

4

1 回答 1

0

Michael Taylor 在引用 Win32 API 的 MSDN 论坛上为这个问题提供了一个很好的答案,该 API 记录了 SCM 将如何响应无效的控制代码(以各种方式拒绝它们)。

仅当 SCM 认为服务处于适当状态并假设服务说它可以处理状态(暂停/继续)时,才会调用状态更改方法。

  • 如果服务停止,将调用 OnStart。
  • 如果服务正在运行,则调用 OnPause。
  • 如果服务暂停,则 OnContinue。
  • 暂停的服务只能恢复或停止。
  • 正在运行的服务只能暂停或停止。
  • SCM 将命令序列化为服务,因此一次只能运行一个命令。

有关服务如何工作的详细信息,请参阅Win32 文档。

于 2013-10-15T21:20:06.527 回答