Cac*_*ack 7 c# windows-services
我遇到过在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();
Run Code Online (Sandbox Code Playgroud)
调用时,返回错误状态13 GetLastError();
关于如何挂钩preshutdown服务事件的任何想法?