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

时间:2013-08-25 19:27:37

标签: c# windows-services service-control-manager

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

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

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

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

这是MSDN论坛上的一个thread,它说SCM确保状态一致或“至​​少我从未发现[SCM在服务未运行时发送停止请求的情况]或暂停]可能发生“。

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

  

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

1 个答案:

答案 0 :(得分:0)

迈克尔·泰勒在引用Win32 API的MSDN论坛上提供了a good answer这个问题,该文件记录了SCM在响应无效控制代码时所做的工作(以各种方式拒绝它们)。

  

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

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

有关更多信息,请参阅有关服务工作方式的Win32 documentation