1

我的 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

4 回答 4

2

可以在BCL 团队博客上的这篇文章中找到处理此问题的首选方法。本文包含一些有关托管服务如何与 SCM 交互的背景知识,这对于理解为什么不再推荐问题中显示的方法很重要。

简而言之,ServiceBase 现在为您处理服务状态管理,您的代码只需要在需要时请求额外的时间。阅读这篇文章,了解在 .NET 中编写 SCM 友好服务的其他一些好的指南。

于 2011-02-01T23:46:21.650 回答
0

使用ManualResetEvent可能是诀窍。

于 2010-02-15T13:08:21.417 回答
0

经过一些测试,它看起来是系统问题而不是我的服务问题。

于 2010-02-17T11:38:19.260 回答
0

另一种简单的方法,经过数小时搜索如何包含该setservicestatus方法:

    protected override void OnStop()
    {
        stopTimer();
        m_run = false;
        while (m_queue.Count > 0)
            Thread.Sleep(500);
    }
于 2012-03-14T12:55:29.393 回答