У меня есть приложение WinForms, которое отслеживает, когда система переходит в приостановленное состояние (спящий режим) и когда оно возобновляется. Для этой цели приложение использует класс SystemEvents
. Он отлично работает на моей машине. Однако, похоже, для некоторых пользователей событие с PowerModes.Resume
не всегда поднимается. Приложение получает несколько PowerModes.Suspend
без каких-либо PowerModes.Resume
, между которыми странно.SystemEvents.PowerModeChanged not raise События возобновления
Мой основной вопрос заключается в том, как это может произойти и как его избежать и сделать надежным обнаружение возобновления?
код довольно проста и в основном следующие (очень укороченный):
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.
Что я замечаю из журнала является то, что там на самом деле было Резюме событие, которое возникает в первый раз. Другое дело, что suspend вызывается примерно через 20 минут. Может быть, это какой-то «компьютер», который просто частично просыпается, без фактического включения монитора или около того, и позволяет приложениям обрабатывать все, что им нужно, чтобы/сетевые уведомления и т. Д., А затем снова укладываться »?
Управления питания является одним из наименее надежных частей Windows. Вызванное множеством машиностроителей, все используют то же самое оборудование и ОС и только имеют свою собственную схему BIOS и питания, чтобы отличить их машину от других. Ошибки в изобилии, не зависят от этого. –
И поэтому у нас есть .NET, нет? Хорошо, надежды в сторону. Неужели это не удивительно, что это происходит? Это очень плохо, потому что мое приложение приостанавливает некоторые из его функций во время сна, и мне нужно, чтобы оно возобновилось правильно. Что такое обходное решение? Опрос? – mancze
@mancze Я бы попытался создать легкий поток фона, который проверяет, работает ли система каждые 1 секунду/минута/часы ... что необходимо, и если система работает, но программное обеспечение все еще спит, а затем разбудить его вверх. – Max