【发布时间】:2010-02-15 13:03:55
【问题描述】:
我的 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 来防止这种情况显然是行不通的。
如何获得更多时间(延迟重启)来完成保存?
欢迎提出任何建议。
【问题讨论】:
-
快速提问 - waitHint 是 60 秒 - 1 分钟。那是你真正需要的吗? (你说需要几分钟)。
-
我只需要成为举手并提出问题的人,即为什么要实现以这种方式运行的长寿命缓存。我不是说你的整个设计是无效的,我只是说我闻到了一些东西。它可能是来自法国的非常好的奶酪,也可能是非常糟糕的东西。
-
我可以看到你举手了,戴夫。我知道你在想什么——让服务不要在内存中保留这么多的数据。但这就是缓存的想法。无论如何,缓存在几种情况下都会保存,但可以在系统关闭之前加载数据。并且服务器应该很少重新启动。但我需要为最坏的情况做好准备。
-
@dave +1 @maciej 如果您的数据在某种程度上很重要,您应该立即保存它,有些可能的边缘情况您无法涵盖,例如停电有人拔掉插头,没有更多的代码被执行,无论如何你的数据都消失了。
标签: c# .net windows-services timeout system-shutdown