具有相关性的Windows服务的关闭顺序

问题描述

我有一个C#服务,要求在OS重新启动后关闭之前,将某些文本写入sql Server数据库。因此,服务B不应在我的服务之前停止,为了实现这一点,我使用命令添加MSsql$sqlEXPRESS的依赖项

MSsql$sqlEXPRESS

但是,它似乎不起作用,因为我仍然遇到错误

关机正在进行中。
用户“ user”的登录失败。
会话处于终止状态,无法继续执行

在尝试写入sc.exe config MyService depend= MSsql$sqlEXPRESS 中的数据库时。有时,该错误是“无效句柄”错误

我想念什么?另外,OnShutdown()显示依赖关系,但sc.exe qc MyService下的依赖关系则什么也不显示。为什么?

解决方法

从文档中

请注意,默认情况下,在服务关闭期间,SCM不会执行 依赖关系。 SCM列举了 运行服务并发送SERVICE_CONTROL_SHUTDOWN命令。 因此,一个服务可能会失败,因为它依赖于另一个服务 已经停止了。

要手动设置服务的关闭顺序,请创建一个多字符串 注册表值,其中包含服务名称的顺序为 应该关闭它们并将其分配给Control键的 PreshutdownOrder值,如下所示:

HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ PreshutdownOrder =“关闭顺序”

Service Control Handler Function