【问题标题】:C# windows service does not always stop on shutdownC# windows 服务并不总是在关机时停止
【发布时间】:2013-06-25 19:38:57
【问题描述】:

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

有没有办法让 Windows 等待我的服务停止? 有没有办法改变订单窗口停止服务?

【问题讨论】:

  • 为什么您的服务没有足够的时间停止?您能否更改服务以使其准备好更快地停止?
  • 我的服务 on_stop 只做一件事。它更新 sql server 上的记录。这需要几毫秒:)
  • 您确定您的服务没有卡在做其他事情,因此没有从 Windows 获取事件吗?
  • 几毫秒应该没问题。碰巧,SQL Server 不在同一台计算机上,是吗?如果是,它可能会在您的服务关闭之前关闭。是否可以在每次数据更改时更新记录,或者在计时器上每隔几秒更新一次?这样您就可以毫不拖延地退出。
  • 我已经检查过了。我有两行代码停止。一个停止的写入日志开始,一个是 sql 更新。关机后我检查日志。大约 60% 停止运行并保存日志。 40% 没有日志,没有 sql 更新。

标签: c# service windows-services


【解决方案1】:

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

如果您的服务需要更多时间来关闭,您可能可以发回 STOP_PENDING 消息,但即便如此,您也被限制在大约 125 秒之前系统认为您永远不会将关闭,并从你身下拉出地毯。

在 C# 中,您将在关机期间调用服务调用 RequestAdditionalTime。同样,不能保证你会得到额外的时间,但你可以要求。但是请记住,如果您要求更多时间,则最好在该时间到期之前完成,或者您可以要求更多。但最终系统关闭你(同样,可能在不到 2 分钟的时间内)。

一般来说,我发现最好构建自己的服务,以便可以快速关闭它。如果您无法在几秒钟内关闭,您可能需要更改您的设计。

【讨论】:

    【解决方案2】:

    这可以为您(以及搜索相同答案的人)提供答案: Why doesn't the RequestAdditionalTime() method work on restart in Vista/7?:

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

    这就是为什么它有时能正确关机有时不能正常关机的原因。

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

    【讨论】:

    • 好的。我想知道是否有办法克服这个限制并强制窗口等待这个服务停止......
    • PreShutdown 可以阻止系统关闭,SENS Logoff 信号可以阻止系统。
    【解决方案3】:

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

    base.RequestAdditionalTime(1000 * 60 * 2);
    

    【讨论】:

    • 也将其添加到您的OnShutdown
    • 它仍然不能正常工作:(我应该把这条线放在哪里?我的起点是填充
    • 受保护的覆盖 void OnStop() { changePbxStatus("Disconnected", "", ""); WriteLog("服务关闭:"); }
    • 我阅读了这些天的日志,我可以看到有时我会完全停止。有些时间根本不会停止,有些时候可能无法连接到 sql,可能是因为 lan 在我的服务之前停止了......
    • 把它放在你方法的开头;你应该有适当的异常处理。将您的方法的整个主体放在try { body } catch(Exception x) { log(x); } 中一段时间​​,看看那里发生了什么(我知道catch(Exception x) 是一种不好的做法。但是当我们无法在运行时识别来源时;它可以作为诊断工具提供帮助)。跨度>
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-22
    • 1970-01-01
    • 1970-01-01
    • 2018-10-28
    • 1970-01-01
    相关资源
    最近更新 更多