Таймер C#, который срабатывает каждые X секунд, но остается синхронизированным с Реальным временем (т. е. без дрейфа)
есть ли таймер .NET, доступный в C#, который может гарантировать, что нет "дрейфа" между событиями? То есть, если вы установите таймер на каждые X секунд, что после нескольких дней работы он не будет дрейфовать, то есть для обеспечения того, чтобы количество событий X секунд в день оставалось синхронизированным с тем, что должно быть?
Если нет, есть ли известный пример кода, который обернул бы функцию таймера в C#, чтобы сделать это?
2 ответов
жаль только даю вам ссылку на quartz.net, но это полное, предприятия, проверено ... библиотека... вам не нужно изобретать колесо:)
Если вы беспокоитесь о накладных, каково ваше определение накладных расходов? это размер файла (двоичные файлы около 0,5 мб) или накладные расходы в логике.
ну для логики-часть: я думаю, что реализация их IJob
-интерфейс делает хорошую работу, чтобы заставить лучший код потребителя. я не большой друг встроенные методы (как пример, так как вы можете запускать их указатели по истечении таймера) - классы дадут вам гораздо больше возможностей, и еще раз, заставят лучше ООП, домен-дизайн, ...
но: делать Console.WriteLine(...)
С quartz.net будет излишним ... :)
Я предполагаю, что вы уже пробовали что-то, и это дрейфует.
Если вы хотите, чтобы что-то стрелять, скажем, каждые 5 секунд с часа (5,10,15,20..), вы можете установить таймер для запуска один раз, а затем в обратном вызове сбросить таймер для запуска в DateTime.Сейчас + количество секунд в течение 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();
}