【问题标题】:How to delay Topshelf service stopping during OS shutdown如何在操作系统关闭期间延迟 Topshelf 服务停止
【发布时间】:2017-02-23 08:48:52
【问题描述】:

我们有一个使用 Topshelf (4.0.1) 创建的 Windows 服务。有什么办法可以在操作系统关闭期间延迟它的停止?

我知道这是非常有问题的愿望,所以解释一下:假设我们有 win 服务,在关机期间需要一些额外的时间(有些任务必须正确完成,现在我们无法更快地执行它)。

可以通过在服务OnStop() 中调用RequestAdditionalTime() 来延迟标准服务停止(例如由Powershell Stop-Service cmdlet 等执行...)。以这种“标准”方式停止服务时一切正常......但是在系统关闭期间不能使用RequestAdditionalTime()(即Windows服务OnShutdown())。因此,我已经在经典的 Windows 服务中实现了这个 SO answer approvach,并且实现了 3:20 延迟(这就是我们所需要的)。

但提到的 SO 答案解决方案(黑客,更好的说法)不适用于 Topshelf。

有没有办法用 Topshelf 做到这一点?

【问题讨论】:

  • 停电时,您没有时间正确完成任务。将系统关闭视为您收到一点警告的断电。如果您需要做更多的工作,请安排好它发生在在停电之前。这可能很痛苦,但重新构建系统以在系统关闭期间不需要做这么多工作是更好的长期方法。
  • 例如SQL Server 有一个事务日志,其中记录了事务完成时它将执行的所有操作。在下一次启动期间,它使用该日志来确定哪个事务已完成并确保它们的影响发生,并且类似地回滚任何未完成的事务。通过这种方式,它可以在启动期间以更多工作为代价快速关闭 - 但它必须以这种方式弹性应对突然关闭(包括,如前所述,断电)跨度>
  • 在理想世界中,一切都可以在事务中完成,这真的不是问题。想象一下,您发送电子邮件时,您希望尽量减少发送重复邮件的情况,因为您无法编写已经发送完毕的信息。

标签: c# windows-services topshelf


【解决方案1】:

应该可以注册一个自定义的EnvironmentBuilder(在HostConfigurator 实例上使用扩展方法UseEnvironmentBuilder)返回HostEnvironment 接口的自定义实现。 HostEnvironment.CreateServiceHost 方法的自定义实现可以返回您需要的任何Host 实现(例如HostRun()s 您的ServiceBase)。

您可以通过将调用分别转发到WindowsHostEnvironmentWindowsServiceHost 类来重用其他HostEnvironment / Host 方法的实现。 WindowsHostEnvironment 实例可以简单地在您的自定义 EnvironmentBuilder 构造函数中创建(并传递给自定义 HostEnvironment)。

【讨论】:

  • @zbynour 我正在尝试在 Topshelf 中创建类似的东西。你能分享你的代码吗?
  • @Misiu 按照答案本身应该就足够了。您对哪个特定问题感兴趣?
  • @zbynour 我不知道如何使用您的问题中的UseEnvironmentBuilderServicePreshutdownBase。如果我使用UseEnvironmentBuilder,我必须通过EnvironmentBuilderFactory,在这里我不知道如何将这两者结合起来
  • @Misiu 看看那个:gist.github.com/zbynourcz/575110dfd65becd3078da6da8353df85 FooHostEnvironment.CreateServiceHost() meth 很重要,因为你在那里返回 Host 实例。作为Host 实例,您可以使用自己的实现继承Topshelf.Runtime.Windows.WindowsServiceHost(实现ServiceBase)。有帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多