Таймер C#, который стреляет каждые X секунды, но остается в синхронизации с реальным временем (т.е. без дрейфа)

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

В противном случае существует ли известный пример кода, который перенес бы Таймерную функцию в C#, чтобы сделать это?

7
задан Greg 21 July 2010 в 06:30
поделиться

2 ответа

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

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

но: делать Console.WriteLine(...) с quartz.net было бы перебором... :)

6
ответ дан 6 December 2019 в 08:13
поделиться

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

Если вы хотите, чтобы что-то срабатывало, скажем, каждые 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();
}
16
ответ дан 6 December 2019 в 08:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: