根据MSDN documentation

这是否意味着当计算机从 sleep 中唤醒时会调用“ResumeAutomatic”,而在用户输入凭据后登录时会调用“ResumeSuspend”吗?
我正在使用tcp套接字与服务器通信。因此,为了在系统从 sleep 状态恢复时重新连接到服务,我有以下代码

    protected override bool OnPowerEvent(PowerBroadcastStatus powerStatus)
    {
        Logger.Log("Power status is : " + powerStatus);
        if (powerStatus == PowerBroadcastStatus.ResumeAutomatic)
        {
            ConnectionWatchdog.ReConnect();
        }
        return base.OnPowerEvent(powerStatus);
    }
但是我发现枚举值是随机的。以下是在3次不同的唤醒时间下的3条不同的迹线。
20150525#094449::电源状态为:暂挂
20150525#094716::电源状态为:ResumeSuspend

20150525#103431::电源状态为:暂挂
20150525#103525::电源状态为:ResumeSuspend
20150525#103525::电源状态为:ResumeAutomatic

20150525#103558::电源状态为:暂挂
20150525#103835::电源状态为:ResumeAutomatic

最佳答案

它应该如何工作
(实际上,这不是所有方法的工作方式-参见下文。)
恢复自动
当计算机在 sleep 后恢复后,始终会发送此消息。
恢复挂起
sleep 后计算机已恢复运行,并且Windows认为有用户在场-即在机器前坐着一个人。当以下情况之一时,发送此消息:a)唤醒是由人为交互(有人按下电源按钮,按下某个键,移动鼠标等)引起的;或b)机器由于唤醒计时器而自动唤醒后,第一次进行人机交互。
为了直接回答您的问题,ResumeSuspend是在用户第一次与计算机进行交互时发送的。可以输入密码来解锁,但这不是必须的。如果用户只是扭动鼠标,ResumeSuspend仍将被发送。
总结一下:

当计算机从 sleep 状态恢复时,始终发送

  • ResumeAutomatic。
  • 当计算机从 sleep 状态恢复并且Windows认为存在用户时,将发送
  • ResumeSuspend以及ResumeAutomatic。

  • 实际运作方式
  • ResumeAutomatic有时根本不发送。这是一个长期存在的错误,大概是Windows本身的错误。幸运的是,我从未见过计算机在没有发送ResumeAutomatic和ResumeSuspend的情况下唤醒。 如果您需要知道系统已经恢复,但是不管用户是否在那儿,则需要同时监听ResumeAutomatic和ResumeSuspend并将它们视为同一事物。
  • ResumeSuspend非常不可靠。我从未见过它应该在不应该发送的情况下发送,但是通常在不应该发送的情况下发送(即实际上根本没有用户的时候)。无论是由于Windows中的一个或多个错误,第三方驱动程序,固件还是硬件,我都不知道。
  • 如果在没有相应的ResumeSuspend的情况下发送了ResumeAutomatic,则系统空闲超时很短(Windows 10中默认为2分钟),并且所连接的显示器保持省电模式。发送相应的ResumeSuspend后,系统空闲超时是正常的(在Windows 10中默认为30分钟),并且唤醒了所连接的显示器。这样一来,如果计算机自动唤醒以执行维护等操作,计算机将尽快回到 sleep 状态。如果Microsoft能够使其可靠运行,那就太好了。

  • 不幸的是,我不得不深入Windows对电源管理,配置文件等的支持。Vista时代的东西令人沮丧,因为它基于质量和周到的设计,但是实现和文档均如此还不完全存在,并且从未修复过。我还没有深入探讨其他许多小问题。真是太丢人了。

    关于c# - Windows Service的ResumeAutomatic和ResumeSuspend模式之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30433432/

    10-10 23:11