SystemEvents.PowerModeChanged не вызывает события Resume

У меня есть приложение WinForms, которое отслеживает, когда система переходит в состояние ожидания (спящий режим) и когда она возобновляет работу. Приложение использует SystemEvents класс для этой цели. Он отлично работает на моей машине. Однако, похоже, что для некоторых пользователей событие с PowerModes.Resume не всегда поднимается. Приложение получает несколько PowerModes.Suspend без всяких PowerModes.Resume между которыми странно.

Мой основной вопрос: как это могло произойти и как избежать этого и сделать надежным обнаружение резюме?

Код довольно прост и в основном следующий (очень сокращенный):

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.

Что я заметил из журнала, так это то, что на самом деле впервые произошло событие Resume. Другое дело, что приостановка вызывается примерно через 20 минут. Может ли это быть что-то вроде "компьютер просто частично просыпается без фактического включения монитора и т. Д. И позволяет приложениям обрабатывать все, что им нужно / для сетевых уведомлений и т. Д. / И что опять усыпляется"?

1 ответ

Согласитесь с Хансом на 150%, не фанат работы с Windows по управлению питанием. Лучше всего было бы создать легкий сервис, который будет работать постоянно и информировать ваше программное обеспечение, когда оно запускается снова; это было какое-то время, но я считаю, что сервисы могут запускать события, как только они снова запускаются, при запуске, паузе и т. д.

Вы можете сделать смесь из двух вариантов и убедиться, что режим сна является причиной остановки службы перед тем, как вести журнал приостановки работы системы. Затем используйте событие запуска / возобновления службы, чтобы снова включить все. Возможно, вы могли бы поместить логику регистрации в ваш сервис в зависимости от того, что еще использует эти данные.

Вот информация о продолжении события от msdn: https://msdn.microsoft.com/en-us/library/system.serviceprocess.servicebase.oncontinue(v=vs.110).aspx

Другие вопросы по тегам