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