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

StackOverflow https://stackoverflow.com/questions/3296784

  •  18-09-2020
  •  | 
  •  

Вопрос

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

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

Это было полезно?

Решение

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

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

но:делает Console.WriteLine(...) с кварцем.нетом было бы перебором...:)

Другие советы

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

Если вы хотите что-то выстрелить, скажите каждые 5 секунд с часа (5,10,15,20 ..), вы могли бы установить свой таймер для стрельбы один раз, затем в своем обратном вызове, сбросьте таймер, чтобы пожар в DateTime. Wow + Количество секунд до следующего 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();
}
.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top