8

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

  1. Windows 是否有可能等待这么长时间才能正常关闭服务?
  2. 服务中是否有选项可以指示当服务被操作系统关闭时会发生什么,例如完全防止关闭?
  3. 另外,作为另一种情况,如果服务器需要重新启动会发生什么?它可以等待几个小时的服务吗?
  4. 操作系统在终止服务之前等待服务的时间是否有限制?
4

3 回答 3

8

您可以使用CanStop、CanShutdown、CanHandlePowerEvent在计算机关闭时收到通知并做出充分响应。

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

protected override void OnShutdown() 
{
    base.RequestAdditionalTime(MaxTimeout);
    serviceCore.OnShutdown();
    Stop(); 
}

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

我推荐 BCL 团队有一篇关于该主题的好博文。

于 2011-09-16T07:40:50.180 回答
4

是的,服务可以在完成之前停止关闭,但应该这样做吗?注册表中有超时值,操作系统是什么?

我认为您需要将回调与其他组件分离,或者将数据缓冲到磁盘并以较小的片段发送。停电时会发生什么?或者如果有人厌倦了等待并关闭?

如果数据很关键,请在内存之外对其进行管理,并使进程可重新启动。这将解决您漫长的关机过程。同样,一种轮询组件以获取进度的方法,消除了对阻塞的依赖。

于 2011-09-16T06:52:55.827 回答
0

您不能在 OnShutdown() 内使用 RequestAdditionalTime(MaxTimeout) ...

于 2013-09-25T07:37:44.713 回答