Таймер C #, который срабатывает каждые X секунд, но синхронизируется с реальным временем (т.е. без смещения) - PullRequest
7 голосов
/ 21 июля 2010

Имеется ли в C # таймер .NET, который может гарантировать, что между событиями не будет "дрейфа"? То есть, если вы устанавливаете таймер на отключение каждые X секунд, чтобы после нескольких дней работы он не дрейфовал, т.е. чтобы гарантировать, что количество приближающихся событий X секунд в день остается в синхронизации с тем, что должно быть?

Если нет, то есть ли хорошо известный пример кода, который бы обернул функцию Timer в C # для этого?

Ответы [ 2 ]

16 голосов
/ 21 июля 2010

Я предполагаю, что вы уже что-то пробовали, и что это дрейфует.

Если вы хотите, чтобы что-то срабатывало, скажем, каждые 5 секунд от часа (5,10,15,20 ..),Вы можете установить таймер на срабатывание один раз, а затем в обратном вызове сбросить таймер на значение DateTime.Now + количество секунд до следующего интервала в 5 секунд.

Это предотвратит любой дрейф, пока ваши часыэто правильно.

Как-то так

System.Timers.Timer timer = new Timer();

void Init()
{
    timer.Elapsed += timer_Elapsed;
    int wait = 5 - (DateTime.Now.Second % 5);
    timer.Interval = wait*1000;
    timer.Start();
}


void timer_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
    timer.Stop();
    int wait = DateTime.Now.Second % 5;
    timer.Interval = wait * 1000;
    timer.Start();
}
6 голосов
/ 21 июля 2010

извините, что дал вам только ссылку на quartz.net , но это полностью квалифицированная, проверенная, ... библиотека ... предприятие ... вам не нужно изобретать велосипед :)

если вы беспокоитесь о накладных расходах, как вы определяете накладные расходы? это размер файла (двоичные файлы около 0,5 МБ) или издержки в логике. хорошо для логической части: я думаю, что реализация их IJob -интерфейса делает хорошую работу, чтобы заставить лучший код потребителя. я не такой большой друг inline-методов (как пример, вы можете использовать их указатели по истечении таймера) - классы дадут вам гораздо больше возможностей, и еще раз, заставят лучше работать, доменный дизайн, .. .

но: делать Console.WriteLine(...) с quartz.net было бы излишне ...:)

...