【发布时间】: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