首页 > 解决方案 > 具有依赖关系的 Windows 服务的关闭顺序

问题描述

我有一个 C# 服务需要在操作系统重启后关闭之前将特定文本写入 SQL Server 数据库。所以服务MSSQL$SQLEXPRESS不应该在我的服务之前停止,为了实现这一点,我添加了MSSQL$SQLEXPRESS使用命令的依赖项

sc.exe config MyService depend= MSSQL$SQLEXPRESS

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

正在关机。
用户 'user' 登录失败。
无法继续执行,因为会话处于 kill 状态

当试图写入数据库时OnShutdown()​​。有时错误是“无效句柄”错误..

我错过了什么?此外,sc.exe qc MyService显示依赖关系,但下的依赖关系services.msc不显示任何内容。为什么?

标签: c#sql-serverwindowsservicesystem-shutdown

解决方案


从文档:

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

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

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\PreshutdownOrder="关机顺序"

服务控制处理函数


推荐阅读