如何在OS关闭期间延迟Topshelf服务停止

时间:2017-02-23 08:48:53

标签: c# windows-services topshelf

我们使用Topshelf(4.0.1)创建了一个Windows服务。有没有办法在操作系统关闭期间如何延迟它停止?

我知道这很有问题,所以解释一下:让我们说我们已经赢得了服务,在关机期间需要一些额外的时间(一些任务必须正确完成,而且现在我们有无法如何更快地执行)。

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

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

Topshelf怎么办?

1 个答案:

答案 0 :(得分:1)

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

您可以通过分别转发到HostWindowsHostEnvironment类的调用来重用其他WindowsServiceHost / WindowsHostEnvironment方法的实现。可以在自定义EnvironmentBuilder构造函数中简单地创建HostEnvironment实例(并传递到自定义Fiddler.FiddlerApplication.AfterSessionComplete += FiddlerApplication_AfterSessionComplete; Fiddler.FiddlerApplication.Startup(8888, FiddlerCoreStartupFlags.Default); Fiddler.FiddlerApplication.AfterSessionComplete += delegate(Fiddler.Session oS) { Monitor.Enter(oAllSessions); oAllSessions.Add(oS); Monitor.Exit(oAllSessions); }; Fiddler.FiddlerApplication.Shutdown(); )。