Windows服务的ResumeAutomatic和ResumeSuspend模式之间的区别

Cur*_*ous 5 .net c# windows-services

根据MSDN文档

ResumeAutomatic:计算机已自动唤醒以处理事件.

注意:如果系统在广播ResumeAutomatic后检测到任何用户活动,它将广播ResumeSuspend事件,让应用程序知道他们可以恢复与用户的完全交互.

ResumeSuspend:系统暂停后恢复运行.

这是否意味着当计算机从睡眠状态唤醒时调用"ResumeAutomatic"并在用户输入凭据后登录时调用"ResumeSuspend"?

我正在使用tcp套接字与服务器通信.因此,为了在系统从休眠状态恢复时重新连接到服务,我有以下代码

    protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
    {
        Logger.Log("Power status is : " + powerStatus);
        if (powerStatus == PowerBroadcastStatus.ResumeAutomatic)
        {
            ConnectionWatchdog.ReConnect();
        }
        return base.OnPowerEvent(powerStatus);
    }
Run Code Online (Sandbox Code Playgroud)

但我观察到枚举值是随机的.以下是3种不同唤醒时间的3种不同痕迹.

20150525#094449 ::电源状态为:暂停

20150525#094716 ::电源状态为:ResumeSuspend


20150525#103431 ::电源状态为:暂停

20150525#103525 ::电源状态为:ResumeSuspend

20150525#103525 ::电源状态为:ResumeAutomatic


20150525#103558 ::电源状态为:暂停

20150525#103835 ::电源状态为:ResumeAutomatic

Loo*_*ofy 7

它应该如何工作

(这不是它在实践中的运作方式 - 见下文.)

ResumeAutomatic

当计算机在睡眠后恢复时,始终会发送此消息.

ResumeSuspend

睡眠后计算机已恢复,Windows认为用户在场 - 即机器前面有人坐着.当a)唤醒是由人为交互(某人按下电源按钮,按下按键,移动鼠标等)引起时,会发送此消息; 或b)由于唤醒定时器,机器自动唤醒后第一次出现人机交互.

要直接回答您的问题,ResumeSuspend将在用户第一次与计算机进行交互时发送.这可能是输入密码来解锁它,但它不一定是.如果用户只是挥动鼠标,仍会发送ResumeSuspend.

总结一下:

  1. 当计算机从睡眠状态恢复时,始终会发送ResumeAutomatic.
  2. 当计算机从睡眠状态恢复并且Windows认为存在用户时,将发送ResumeSuspend 以及 ResumeAutomatic.

它是如何工作的

  1. ResumeAutomatic偶尔也不会被发送.这是一个长期存在的错误,可能是在Windows本身.幸好我从来没有见过计算机之后与两个 ResumeAutomaticResumeSuspend未发送.如果你需要知道系统已经恢复,但不关心用户是否在那里,你需要同时监听ResumeAutomaticResumeSuspend并将它们视为同一个东西.
  2. ResumeSuspend非常不可靠.我从来没有看到过它应该发送的时候,但它经常被发送,当它应该发送时- 实际上根本就没有用户.无论这是由于Windows中的一个或多个错误,第三方驱动程序,固件还是硬件,我都不知道.
  3. ResumeAutomatic发送时没有相应的ResumeSuspend时,系统空闲超时很短(Windows 10中默认为2分钟),并且连接的显示器保持在省电模式.发送相应的ResumeSuspend时,系统空闲超时正常(Windows 10中默认为30分钟),并且连接的显示被唤醒.这样如果计算机自动唤醒以执行维护等,计算机就会尽快恢复睡眠状态.如果微软能够使其可靠地工作,那将是非常棒的.

我不得不深入了解Windows对电源管理,配置文件等的支持.Vista时代的东西令人沮丧,因为它基于质量和周到的设计,但实现和文档是不能令人信服,也从未得到修复.还有很多其他问题我没有进入这里.这有点遗憾.

  • @Fadi:微软从未参与过,虽然我当然想看看源代码!只是数周和数周(和数周)令人痛苦的、有条不紊的测试。我参与了一个严重依赖 Windows 电源配置文件、睡眠/空闲到睡眠行为等的产品。当你结合 Windows 错误、固件错误、驱动程序错误和文档错误/不足时,疯狂就在等待。 (2认同)