是否可以使用.net注册PreShutdown服务事件?

本文关键字:服务 事件 PreShutdown 注册 可以使 net 是否 | 更新日期: 2023-09-27 18:08:49

我遇到了一种情况,我在win2008r2服务器上部署了一个。net (c#)服务。该服务依赖于MSMQ。在关闭时,它需要在终止前发送几个快速消息。这与手动触发OnStop()事件一起工作很好,但是当服务器关闭并且SCM调用OnShutdown()时,我发现MSMQ已经关闭并且我的服务无法正确清理。我的服务只需要2-5秒来完成它的工作。

我明白(现在)服务依赖只适用于启动,所以这没有帮助。我今天花了一些时间试图弄清楚如何注册我的服务接受新的(自Vista)可用的SERVICE_ACCEPT_PRESHUTDOWN事件和preshutdownnorder功能(http://blogs.technet.com/b/askperf/archive/2008/02/04/ws2008-service-shutdown-and-crash-handling.aspx)的工作,但这是不支持在框架中实现的ServiceBase,据我所知。

我沿着尝试使用SetServiceStatus()函数手动设置它的路径,但它似乎不起作用。

_serviceHandle = this.ServiceHandle;
SERVICE_STATUS serviceStatus = new SERVICE_STATUS();
serviceStatus.currentState = (int)State.SERVICE_RUNNING;
serviceStatus.controlsAccepted = (int)(ControlsAccepted.SERVICE_ACCEPT_PRESHUTDOWN | ControlsAccepted.SERVICE_ACCEPT_STOP);
serviceStatus.waitHint = 0;
serviceStatus.checkPoint = 0;
bool setStatus = SetServiceStatus(_serviceHandle, ref serviceStatus);
int error = Marshal.GetLastWin32Error();

调用GetLastError();

返回错误状态13

关于如何钩入预关机服务事件有什么想法吗?

是否可以使用.net注册PreShutdown服务事件?

好的,那么另一种选择是创建/获取/购买一个c++服务,该服务注册PreShutdown的东西,并按照您所需的顺序停止/关闭您的。net服务(并等待它们实际退出)。

它可以有自己的关闭顺序列表/图表,或者使用现有的Windows启动依赖项(忽略它不应该管理的服务)构建它。

如果您将在服务关闭时和关闭时向数据库/文件写入消息计算机重新启动,检查表/文件并发送消息给MSMQ