Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在操作系统关闭期间延迟Topshelf服务停止_C#_Windows Services_Topshelf - Fatal编程技术网

C# 如何在操作系统关闭期间延迟Topshelf服务停止

C# 如何在操作系统关闭期间延迟Topshelf服务停止,c#,windows-services,topshelf,C#,Windows Services,Topshelf,我们使用Topshelf(4.0.1)创建了一个windows服务。在操作系统关闭期间,有没有办法延迟它的停止 我知道这是一个相当有问题的问题,所以请给出一个解释:假设我们已经赢得了在关机期间需要额外时间的服务(一些任务必须正确完成,现在我们无法更快地执行) 通过调用服务OnStop()中的RequestAdditionalTime(),可以延迟标准服务停止(例如通过Powershellstop servicecmdlet等执行)。当以这种“标准”方式停止服务时,一切都很好。。。但是系统关闭期间

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

我知道这是一个相当有问题的问题,所以请给出一个解释:假设我们已经赢得了在关机期间需要额外时间的服务(一些任务必须正确完成,现在我们无法更快地执行)

通过调用服务
OnStop()
中的
RequestAdditionalTime()
,可以延迟标准服务停止(例如通过Powershell
stop service
cmdlet等执行)。当以这种“标准”方式停止服务时,一切都很好。。。但是系统关闭期间不能使用
RequestAdditionalTime()
(即windows服务
OnShutdown()
)。正因为如此,我在经典的windows服务中实现了这种方法,并由此实现了3:20的延迟(这就是我们所需要的)

但上面提到的答案解决方案(hack,更确切地说)不适用于Topshelf


使用Topshelf有什么办法吗?

应该可以注册一个自定义的
环境构建器
(在
主机配置器
实例上使用扩展方法
UseEnvironmentBuilder
),该方法返回一个自定义的
主机环境
接口实现。
HostEnvironment.CreateServiceHost
方法的自定义实现可以返回所需的
Host
的任何实现(例如
ServiceBase
Host


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

停电时,您没有时间正确完成任务。将系统关闭视为断电,您会得到一点警告。如果你需要做更多的工作,在停电之前安排好。这可能是痛苦的,但重新设计系统,使其在系统关闭期间不需要做太多工作,是更好的长期方法。SQL Server有一个事务日志,其中记录了事务完成时它将执行的所有操作。在下一次启动期间,它使用该日志来确定哪个事务已经完成,并确保它们的效果发生,同样,它还可以回滚任何未完成的事务。通过这种方式,它能够在启动过程中以牺牲更多工作为代价快速关闭-但必须采用这种方式才能适应突然关闭(包括,如前所述,断电)在理想世界中,一切都可以在事务中完成,这真的不是问题。假设您发送电子邮件,您希望尽量减少发送重复邮件的情况,因为您无法写入已发送完的信息。@zbynour我正试图在Topshelf中创建类似的内容。你能分享一下你的密码吗?@Misiu它应该足够跟随答案本身了。您感兴趣的具体问题是什么?@zbynour我不知道如何使用您的问题中的
UseEnvironmentBuilder
ServicePreshutdownBase
。如果我使用
usenevironmentbuilder
我必须通过
EnvironmentBuilderFactory
这里我不知道如何将它们结合起来two@Misiu看看这个:
FooHostEnvironment.CreateServiceHost()
meth非常重要,因为您在那里返回了
Host
实例。作为
主机
实例,您可以使用自己的实现继承
Topshelf.Runtime.Windows.WindowsServiceHost
(实现的是
ServiceBase
)。有帮助吗?