我的Windows服务是一个具有大量缓存的数据服务器。在服务OnStop期间,我保存缓存,以便不丢失任何数据。保存缓存可能需要几分钟,以防止Windows服务管理器超时我使用SetServiceStatus Win32回调:
this.serviceStatus.currentState = (int)State.SERVICE_STOP_PENDING;
this.serviceStatus.checkPoint = 1;
this.serviceStatus.waitHint = 60000;
SetServiceStatus(Process.GetCurrentProcess().Handle, ref this.serviceStatus);
工作正常。
我还将CanShutdown设置为true并添加了OnShutdown,以便该服务可以进行系统关闭验证。在这里,我有效地做了与OnStop相同的事情:
protected override void OnShutdown()
{
this.OnStop();
base.OnShutdown();
}
这不太好用。当系统关闭时,当保存缓存时,我得到“设备未就绪”。这表明Windows在停止/关闭之前中止服务。使用SetServiceStatus防止它显然不起作用。
如何获得更多时间(延迟重启)以完成保存?
欢迎任何建议。
答案 0 :(得分:2)
可以在this article on the BCL Team's blog中找到处理此问题的首选方法。本文包含有关托管服务如何与SCM交互的一些背景知识,这对于理解为什么不再推荐问题中显示的方法非常重要。
简单地说,ServiceBase现在为您处理服务状态管理,您的代码只需要在需要时请求额外的时间。阅读文章,了解在.NET中编写SCM友好服务的其他一些好的指导原则。
答案 1 :(得分:0)
使用ManualResetEvent可能就是诀窍。
答案 2 :(得分:0)
经过一些测试后,它看起来是系统的问题,而不是我的服务。
答案 3 :(得分:0)
另一种简单的方法,在数小时搜索如何包含setservicestatus
方法之后:
protected override void OnStop()
{
stopTimer();
m_run = false;
while (m_queue.Count > 0)
Thread.Sleep(500);
}