我遇到了在Win 2008R2服务器上部署.Net (C#)服务的情况。该服务依赖于MSMQ。在关机时,它需要在终止之前发送几条快速消息。这可以很好地处理手动触发的OnStop()事件,但是当服务器关闭时,SCM调用OnShutdown()时,我发现MSMQ已经关闭,我的服务无法正确清理。我的服务只需要2-5秒就可以完成它的工作。
我知道(现在)服务依赖只适用于启动,所以这是没有帮助的。我今天花了一些时间试图弄清楚如何注册我的服务来接受新的(自Vista以来)可用的SERVICE_ACCEPT_PRESHUTDOWN事件,并使用PreShutDownOrder特性(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
对于如何连接到preshutdown服务事件有什么想法吗?
发布于 2011-11-11 18:02:15
好的,那么另一种选择是创建/获取/购买一个C++服务,该服务注册PreShutdown内容,并按所需的顺序停止/关闭您的.Net服务(并等待它们实际退出)。
它可以有自己的关闭顺序列表/图,也可以使用现有的Windows启动依赖项构建它(忽略不应该管理的服务)。
发布于 2011-09-16 05:26:48
如果要在服务关闭时和计算机重新启动时向数据库/文件写入消息,请检查表/文件并将消息发送到MSMQ
https://stackoverflow.com/questions/7437590
复制相似问题