2015-08-06 4 views
8

У меня есть COM-надстройка для офисных приложений, который выполняет операцию в фоновом режиме каждые 30 минут, используя операциюЧто происходит с таймерами, когда ПК просыпается?

System.Timers.Timer 

Этого фон выполняет аутентификацию пользователя через подключение к Интернету, и у меня есть отчеты некоторых пользователей, аутентификация завершается неудачей, когда их ПК просыпается от сна. Я не могу воспроизвести это поведение самостоятельно, поэтому моя теория заключается в том, что когда компьютер просыпается, фоновая операция выполняется до восстановления соединения с Интернетом (предположительно, соединение было закрыто Windows, когда компьютер заснул).

В общем, если компьютер переходит в режим сна после периода бездействия, что происходит, когда ПК просыпается (в терминах Timers)? Например, Timer приостановлен во время сна, а затем возобновляется с установленным интервалом, когда компьютер просыпается (например, если Timer находился на расстоянии 10 минут в промежутке, когда компьютер заснул, событие Timer.Elapsed не срабатывает до 20 минут после ПК просыпается)? Выключено ли событие Timer.Elapsed, чтобы оно срабатывало сразу после пробуждения ПК? Стоит ли Windows Timer, когда компьютер переспал? Или, работает ли Timer, пока компьютер спит, но поскольку интернет-соединение нарушено (предположительно), фоновая операция не может выполнять аутентификацию пользователя?

+0

Вы можете подписаться на события силовой сети Windows, если это имеет смысл: [Get Sleep/Hibernate и Resume/Wakeup events в Visual Basic.NET] (http://stackoverflow.com/a/11598083/1115360). –

+0

Произошла ли такая же проблема, если пользователь потерял соединение в течение минуты перед запуском таймера? –

+1

Ваше приложение должно терпеть временную потерю соединения в любом случае по всей вероятности. Вам нужно что-то для решения таких вопросов, как повторение. – usr

ответ

-2
static void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e) 
    { 
     Console.WriteLine(String.Format("{0}:{1}:{2} : Timer fired", 
      DateTime.Now.ToLocalTime().Hour, 
      "Execute:" + DateTime.Now.ToLocalTime().Minute, 
      DateTime.Now.ToLocalTime().Second)); 
    } 

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