为啥 RequestAdditionalTime() 方法在 Vista/7 中重新启动时不起作用?

Posted

技术标签:

【中文标题】为啥 RequestAdditionalTime() 方法在 Vista/7 中重新启动时不起作用?【英文标题】:Why doesn't the RequestAdditionalTime() method work on restart in Vista/7?为什么 RequestAdditionalTime() 方法在 Vista/7 中重新启动时不起作用? 【发布时间】:2015-08-17 04:58:45 【问题描述】:

我一直在对我用 C# .Net 3.5 编写的 Windows 服务进行一些广泛的测试。当我重新启动或关闭计算机时,我无法让 Windows 给我足够的时间让我的服务正常关闭,即使我正在调用 RequestAdditionalTime() 方法,该方法应该更新 SCM 并保持我的服务运行。但是,如果我手动停止服务,我的代码可以正常工作。在决定在 Windows Xp 中测试代码后,我主要在 Windows Vista 和 Windows 7 中测试此代码,一切正常。有谁知道为什么这个调用在 Vista/7 中不起作用?我想我需要某种许可来防止系统关闭,这是我在 Xp 中默认获得的,但在 Vista/7 中没有。

【问题讨论】:

【参考方案1】:

如果系统没有关闭,您的服务可以请求额外的时间并且您的进程不会被终止。

如果系统正在关闭,您的服务必须关闭。您甚至没有获得服务通常获得的正常 30 秒。关机比以前更有力了。

【讨论】:

当您关闭或重新启动计算机时,有没有办法知道您的服务将关闭的时间?我知道 WaitToKillServiceTimeout 在 W7 中设置为 12000,在 Vista、Xp 中设置为 20000。但即使您在 W7 或 Vista 中更改此值,它也几乎没有影响。特别是在 Windows 7 中,它会在几秒钟内停止您的服务。感谢您的洞察力。 我想没有办法知道。假设 Windows 允许所有服务在 13 秒内关闭。其他一些服务需要 12 秒的 cpu 时间(因此其他服务在此期间无法执行)并最终关闭。剩下的时间为 1 秒。 Windows 会杀死他们。【参考方案2】:

在非关机情况下,RequestAdditionalTime() 的调用频率必须高于每 2 分钟一次:

    protected override void OnStop()
    
        Thread.Sleep(60000);
        RequestAdditionalTime(180000);
        Thread.Sleep(60000);
        RequestAdditionalTime(180000);
        Thread.Sleep(5000);
    

请注意,尽管有名称,但 time 参数是请求的总关机时间。

【讨论】:

时间参数的含义有参考吗?它没有在 MSDN 上这样列出。 @David:这是一年多以前的事了,但我记得这是我从测试中推断出来的。 这在 Windows 7 中不起作用(但在此处配置)。此外,该示例没有清楚地说明更多时间,因为默认值为 120 秒(此处)并且仅显示了约 125 秒的睡眠时间。

以上是关于为啥 RequestAdditionalTime() 方法在 Vista/7 中重新启动时不起作用?的主要内容,如果未能解决你的问题,请参考以下文章

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?