C#windows服务并不总是在关机时停止

时间:2013-06-25 19:38:57

标签: c# service windows-services

我使用c#2010创建了一个Windows服务。问题是,当计算机关闭时,服务没有时间停止,并且onstop并不总是在执行。我说并不总是因为有时它会设法停止。我曾尝试使用在vista中引入的Windows预关闭通知,但结果更好但不是绝对的。

无论如何让Windows等待我的服务停止? 反正有没有改变订单窗口停止服务?

3 个答案:

答案 0 :(得分:6)

根据http://msdn.microsoft.com/en-us/library/windows/desktop/ms685149(v=vs.85).aspx,服务通常在系统放弃和关闭之前关闭大约20秒。

如果您的服务需要更多时间关闭,可能能够发送STOP_PENDING个消息,但即使这样,您也只能在系统计算出来之前大约125秒永远不会关闭,并从你身下拉出地毯。

在C#中,您可以在关机期间拨打服务电话RequestAdditionalTime。同样,不能保证你会得到额外的时间,但你可以要求它。但请记住,如果你要求更多的时间,那么最好在那个时间到期之前完成,或者你可以要求更多。但最终系统关闭你(再次,可能在不到2分钟内)。

一般情况下,我发现最好是构建服务以便快速关闭服务。如果您在几秒钟内无法关闭,则可能需要更改设计。

答案 1 :(得分:1)

这可以回答你(对于那些搜索相同答案的人): Why doesn't the RequestAdditionalTime() method work on restart in Vista/7?

  

...假设Windows允许所有服务关闭13秒。其他一些服务需要12秒的CPU时间(因此其他服务在此期间无法执行)并最终关闭。所有其余的都留下1秒。 Windows会杀了他们。

这就是为什么它有时会正确关闭的原因,有时则没有。

顺便说一句,Vista有20秒。杀死服务,W7有12秒。和W8有5秒。

答案 2 :(得分:0)

在从ServiceBase派生的服务类中,在覆盖OnStop时,您可以请求额外的时间:

base.RequestAdditionalTime(1000 * 60 * 2);