Таймер 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();
}