.NET窗口服务在系统关闭期间中止

时间:2010-02-15 13:03:56

标签: c# .net windows-services timeout system-shutdown

我的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防止它显然不起作用。

如何获得更多时间(延迟重启)以完成保存?

欢迎任何建议。

4 个答案:

答案 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);
    }