Это зависит от того, как вы используете свои таймеры. Если вы используете их для инициирования какого-либо события, которое происходит нечасто (более пары минут), то вы, вероятно, увидите какое-то «странное» поведение. Поскольку вы не указываете, что это за «странное» поведение, я предполагаю, что таймер вашей программы срабатывает позже, чем должен.
Объяснение. Проблема с переходом в спящий режим/спящий режим заключается в том, что все программы приостанавливаются. Это означает, что ваши таймеры не обновляются, и, таким образом, когда вы спите/впадаете в спящий режим и возвращаетесь обратно, это как если бы вы были заморожены на тот период времени, когда вы спали/впали в спящий режим. Это означает, что если у вас есть таймер, настроенный на отключение через час, и ваш компьютер переходит в спящий режим на отметке 15 минут, после того, как он проснется, у него будет еще 45 минут, независимо от того, как долго компьютер находился в спящем режиме.
Решение. Одно из исправлений состоит в том, чтобы сохранить дату и время, когда событие произошло в последний раз. Затем периодически отключайте таймер (каждые 10 секунд или 10 минут, в зависимости от желаемой точности) и проверяйте дату и время последнего выполнения. Если разница между текущим и последним временем выполнения больше или равна желаемому интервалу, ТОГДА вы запускаете выполнение.
Это исправит это так, что если событие «должно» произойти во время сна/гибернации, оно начнется в тот момент, когда вы вернетесь из сна/гибернации.
Обновление: решение, представленное выше, будет работать, и я добавлю пару деталей, чтобы помочь вам реализовать его.
Вместо создания/удаления новых таймеров создайте ОДИН таймер для использования, который является ПОВТОРЯЮЩИМСЯ (для свойства AutoReset установлено значение true).
Интервал одиночного таймера НЕ должен быть установлен в соответствии со следующим моментом, когда событие должно произойти. Вместо этого для него следует установить выбранное вами значение, которое будет представлять частоту опроса (как часто он проверяет, должно ли выполняться «событие»). Выбор должен быть балансом эффективности и точности. Если вам НУЖНО, чтобы он работал ДЕЙСТВИТЕЛЬНО близко к 00:01, вы устанавливаете интервал около 5-10 секунд. Если менее важно, чтобы это было ровно в 00:01, вы можете увеличить интервал до 1-10 минут.
Вам нужно сохранить DateTime, когда произошло последнее выполнение ИЛИ, когда должно произойти следующее выполнение. Я бы предпочел «когда должно произойти следующее выполнение», чтобы вы не выполняли (LastExecutionTime + EventInterval) каждый раз, когда истекает таймер, вы просто будете сравнивать текущее время и время, когда должно произойти событие.
По истечении таймера и ДОЛЖНО произойти событие (где-то около 00:01), вы должны обновить сохраненную дату и время, а затем запустить код, который вы хотите запустить в 00:01.
Пояснение по сравнению со спящим и гибернационным режимами. Основное различие между спящим и гибернационным режимом заключается в том, что в спящем режиме все хранится в ОЗУ, а в спящем режиме текущее состояние сохраняется на диск. Основное преимущество режима гибернации заключается в том, что оперативная память больше не нуждается в питании и, следовательно, расходует меньше энергии. Вот почему рекомендуется использовать спящий режим вместо сна при работе с ноутбуками или другими устройствами, использующими ограниченное количество энергии.
Тем не менее, нет никакой разницы в выполнении программ, поскольку они приостанавливаются в любом случае. К сожалению, System.Timers.Timer не «пробуждает» компьютер, поэтому вы не можете принудительно запустить свой код в ~00:01.
Я полагаю, что есть ДРУГИЕ способы «разбудить» компьютер, но если вы не пойдете по этому пути, лучшее, что вы можете сделать, это запустить свое «событие» во время следующего «события опроса» вашего таймера после того, как он выйдет из сна / гибернации.
person
docmanhattan
schedule
22.11.2011