我有一个WinForms应用程序,当系统进入挂起状态(睡眠)和恢复时保持跟踪。 App为此使用SystemEvents
类。它在我的机器上正常工作。然而,对于某些用户来说,PowerModes.Resume
的事件似乎并不总是会引发。应用程序收到多个PowerModes.Suspend
而没有任何PowerModes.Resume
之间,这是奇怪的。SystemEvents.PowerModeChanged不提高恢复事件
我的主要问题是如何可能发生,以及如何避免它,使恢复检测可靠?
的代码是非常简单和基本以下(非常缩短):
Imports Microsoft.Win32
Friend Class TehClass
Implements IDisposable
Private Sub New()
AddHandler SystemEvents.PowerModeChanged, AddressOf Me.System_PowerModeChanged
End Sub
Private Sub System_PowerModeChanged(sender As Object, args As PowerModeChangedEventArgs)
Log.Info("Power mode changed: {0}.", args.Mode)
End Sub
#Region "IDisposable Support"
' just dropping handler there
#End Region
End Class
有应用程序内的现有形式的所有时间。但是它可以被最小化或隐藏在通知区域中。此外,还保留参考TehClass
的实际实例。
这是样品日志:
[2015-09-15 22:38:38,501] Power mode changed: Suspend.
[2015-09-16 07:10:31,106] Power mode changed: Resume.
[2015-09-16 08:54:21,112] Power mode changed: Suspend.
[2015-09-16 09:14:36,252] Power mode changed: Suspend.
[2015-09-16 09:35:21,077] Power mode changed: Suspend.
[2015-09-16 09:55:36,085] Power mode changed: Suspend.
[2015-09-16 10:15:50.122] User reported this log therefore the PC had to be in Working (Resumed) state.
我从日志注意的是,这里居然有人提出首次恢复事件。另一件事是暂停被调用大约20分钟的时间间隔。它可能是某种“电脑只是部分唤醒而没有实际上打开显示器,让应用程序处理任何他们需要/网络通知等等,而不是再次进入睡眠”的东西?
电源管理是Windows的最不可靠的部件之一。许多机器制造商都使用完全相同的硬件和操作系统,只有自己的BIOS和电源方案才能将他们的机器与其他机器区分开来。错误嘉豪,不要依赖它。 –
这就是为什么我们有.NET,不是吗?好吧,希望放在一边。所以这不奇怪,以上发生?这真的很糟糕,因为我的应用程序在PC休眠期间暂停了它的一些功能,我需要它恢复正常。什么是预期的解决方法?轮询? – mancze
@mancze我会尝试创建一个轻量级的后台线程,检查系统是否每隔1秒/分钟/小时运行...无论什么是需要的,如果系统正在运行,但软件仍在睡眠,然后唤醒它向上。 – Max