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

Joh*_*ohn 7 .net c# windows-services shutdown long-running-processes

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

  1. Windows可以等待这么长时间才能使服务正常关闭吗?
  2. 在服务中有哪些选项我可以指示当操作系统关闭服务时会发生什么,例如完全阻止关闭?
  3. 另外,作为另一种情况,如果服务器需要重启会发生什么?可以等几个小时的服务吗?
  4. 操作系统在杀死服务之前等待服务的时间有多长?

Nor*_*hir 7

您可以在计算机关闭并充分响应时通知CanStop,CanShutdown,CanHandlePowerEvent.

使用ServiceBase.RequestAdditionalTime方法请求额外的时间来终止您的线程:

protected override void OnShutdown() 
{
    base.RequestAdditionalTime(MaxTimeout);
    serviceCore.OnShutdown();
    Stop(); 
}
Run Code Online (Sandbox Code Playgroud)

如果OnShutdown()阻塞时间超过20秒(默认值存储在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout中),您的服务将被标记为无响应并被终止.

BCL团队就我推荐的那个主题发表了一篇很好的博客文章.

  • 在`OnShutdown`中调用`RequestAdditionalTime`将导致`InvalidOperationException`. (3认同)