Windows服务可以花费数小时才能正常关闭吗?

时间:2011-09-16 06:42:55

标签: c# .net windows-services shutdown long-running-processes

我们有一个.NET Windows服务,以事务方式从A到B挖掘大量高度关键数据。 我们还需要确保服务中使用的所有外部组件都未正确分配,并在关闭服务本身之前清除所有内容。 这可能需要数小时!这样做的原因是服务需要等待外部组件的回调,该回调将在2,3或4小时后到达。

  
      
  1. Windows可能需要等待很长时间才能获得服务   优雅地关机?
  2.   
  3. 在服务中有选项,我可以在其中指示发生的事情   该服务正由操作系统关闭,例如,防止   完全关闭?
  4.   
  5. 另外,作为另一种情况,如果服务器需要,会发生什么   重启?可以等几个小时的服务吗?
  6.   
  7. 操作系统在杀死之前等待服务的时间有限制吗?
  8.   

3 个答案:

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