2010-07-21 9 views
7

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

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

ответ

6

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

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

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

+0

ли это добавить много накладных расходов на небольшое приложение WPF Андреас? то есть выше и выше подхода, предложенного Микаэлем? (то есть, в какой степени он использовал бы кувалду, чтобы взломать орех, так сказать здесь?) – Greg

+0

см. мое редактирование! ... –

+0

+1 Не знал об этой библиотеке, но я обязательно буду помнить об этом. –

15

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

Если вы хотите, чтобы что-то срабатывало, скажем каждые 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(); 
} 
+1

хорошо звучит - Я думаю, мне было интересно, если бы не было уже функция, которая будет делать это уже похоронили в .NET framework где-то – Greg