2015-09-17 4 views
4

У меня есть приложение 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 минут. Может быть, это какой-то «компьютер», который просто частично просыпается, без фактического включения монитора или около того, и позволяет приложениям обрабатывать все, что им нужно, чтобы/сетевые уведомления и т. Д., А затем снова укладываться »?

+3

Управления питания является одним из наименее надежных частей Windows. Вызванное множеством машиностроителей, все используют то же самое оборудование и ОС и только имеют свою собственную схему BIOS и питания, чтобы отличить их машину от других. Ошибки в изобилии, не зависят от этого. –

+0

И поэтому у нас есть .NET, нет? Хорошо, надежды в сторону. Неужели это не удивительно, что это происходит? Это очень плохо, потому что мое приложение приостанавливает некоторые из его функций во время сна, и мне нужно, чтобы оно возобновилось правильно. Что такое обходное решение? Опрос? – mancze

+0

@mancze Я бы попытался создать легкий поток фона, который проверяет, работает ли система каждые 1 секунду/минута/часы ... что необходимо, и если система работает, но программное обеспечение все еще спит, а затем разбудить его вверх. – Max

ответ

1

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

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

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

+0

Я понимаю, что вы имеете в виду, но это кажется слишком реальным излишним для моего дела. Кроме того, этот подход, похоже, приводит к еще большему количеству ошибок: зависимость приложения от службы, обеспечение работы службы, права, необходимые для установки службы, пользователь вручную отключает эту службу ... Да, я упомянул, что мне нужно надежное обнаружение, но не так плохо :). Хотя хорошо иметь идею здесь, поскольку это может быть полезно для кого-то другого. – mancze