我用 c# 2010 创建了一个 windows 服务。问题是当计算机关闭时,服务没有时间停止并且 onstop 并不总是执行。我说不总是因为有时它会停止。我曾尝试使用在 vista 中引入的 Windows 关机前通知,但结果更好但不是绝对的。
反正有没有让 Windows 等待我的服务停止?有没有办法改变订单窗口停止服务?
我用 c# 2010 创建了一个 windows 服务。问题是当计算机关闭时,服务没有时间停止并且 onstop 并不总是执行。我说不总是因为有时它会停止。我曾尝试使用在 vista 中引入的 Windows 关机前通知,但结果更好但不是绝对的。
反正有没有让 Windows 等待我的服务停止?有没有办法改变订单窗口停止服务?
根据http://msdn.microsoft.com/en-us/library/windows/desktop/ms685149(v=vs.85).aspx,在系统放弃并关闭之前,服务通常有大约 20 秒的时间关闭反正下来。
如果您的服务需要更多时间来关闭,您也许可以发STOP_PENDING
回消息,但即便如此,您也被限制在大约 125 秒之前系统认为您永远不会关闭,并从您身下拉出地毯.
在 C# 中,您将在关机期间调用RequestAdditionalTime服务。同样,不能保证你会得到额外的时间,但你可以要求。但是请记住,如果您要求更多时间,则最好在该时间到期之前完成,或者您可以要求更多时间。但最终系统会关闭您(同样,可能在不到 2 分钟的时间内)。
一般来说,我发现最好构建服务以便快速关闭它。如果您无法在几秒钟内关闭,您可能需要更改您的设计。
这可以为您(以及搜索相同答案的人)提供答案: 为什么 RequestAdditionalTime() 方法在 Vista/7 中重新启动时不起作用?:
...假设 Windows 允许所有服务在 13 秒内关闭。其他一些服务需要 12 秒的 cpu 时间(因此其他服务在此期间无法执行)并最终关闭。剩下的时间为 1 秒。Windows 会杀死他们。
这就是为什么它有时会正确关闭而有时却不能正确关闭的原因。
顺便说一句,Vista 有 20 秒。杀死服务,W7有12秒。W8 有 5 秒。
在派生自 的服务类ServiceBase
中,OnStop
您可以请求额外的时间:
base.RequestAdditionalTime(1000 * 60 * 2);