我们有一个.NET Windows服务,以事务方式从A到B挖掘大量高度关键数据。 我们还需要确保服务中使用的所有外部组件都未正确分配,并在关闭服务本身之前清除所有内容。 这可能需要数小时!这样做的原因是服务需要等待外部组件的回调,该回调将在2,3或4小时后到达。
- Windows可能需要等待很长时间才能获得服务 优雅地关机?
- 在服务中有选项,我可以在其中指示发生的事情 该服务正由操作系统关闭,例如,防止 完全关闭?
- 另外,作为另一种情况,如果服务器需要,会发生什么 重启?可以等几个小时的服务吗?
- 操作系统在杀死之前等待服务的时间有限制吗?
醇>
答案 0 :(得分:7)
您可以使用CanStop, CanShutdown, CanHandlePowerEvent在计算机关闭时通知并充分响应。
使用ServiceBase.RequestAdditionalTime方法请求额外的时间来终止你的线程:
protected override void OnShutdown()
{
base.RequestAdditionalTime(MaxTimeout);
serviceCore.OnShutdown();
Stop();
}
如果您的OnShutdown()阻止时间超过20秒(默认值存储在注册表HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ WaitToKillServiceTimeout中),您的服务将被标记为无响应并被终止。
There is a good blog post from the BCL team on that subject that I recommend.
答案 1 :(得分:4)
是的,服务可以在完成之前停止关闭,但应该停止吗?注册表中有超时值,操作系统是什么?
我认为你需要将回调与其他组件分离,或者将数据缓冲到磁盘并发送更小的片段。电源切断会发生什么?或者,如果有人厌倦了等待并关闭?
如果数据很关键,请在内存之外对其进行管理,并使该过程可重新启动。这将解决您的长时间关机过程。同样,一种轮询组件进度的方法也会消除对阻塞的依赖。
答案 2 :(得分:0)
你不能在OnShutdown()...
中使用RequestAdditionalTime(MaxTimeout)