2010-07-21 5 views
7

Czy w C# dostępny jest Timer .NET, który zapewnia, że ​​pomiędzy zdarzeniami nie ma "dryfowania"? Oznacza to, że jeśli ustawisz timer tak, aby wyłączał się co X sekund, to po kilku dniach pracy nie będzie dryfował, tzn. Aby zapewnić, że liczba zbliżeń X sekund w ciągu dnia pozostaje zsynchronizowana z tym, co powinno być?C# timer, który uruchamia się co X sekund, ale pozostaje w zsynchronizowaniu z czasem rzeczywistym (tzn. Bez dryftu).

Jeśli nie, czy istnieje dobrze znany przykład kodu, który otoczyłby funkcję Timer w języku C#, aby to zrobić?

Odpowiedz

6

żal tylko daje link do quartz.net, ale jest to w pełni wykwalifikowanych, przedsiębiorstwo, testowane, biblioteka ... ... nie trzeba narastającymi koło :)

jeśli martwisz się o obciążenie, jaka jest twoja definicja dla kosztów ogólnych? jest to rozmiar pliku (pliki binarne to około 0,5 MB) lub obciążenie w logice. również dla części logicznej: uważam, że implementacja ich interfejsu IJob wykonuje dobrą robotę, aby wymusić lepszy kod konsumenta. nie jestem wielkim przyjacielem inline-metod (tak jak na przykład, ponieważ możesz wystrzelić swoje wskaźniki po upłynięciu czasu) - zajęcia dałyby ci o wiele więcej możliwości, i jeszcze raz, wymuś lepszą jakość, projektowanie domen, ... .

ale: robi Console.WriteLine(...) z quartz.net byłoby przesadą ... :)

+0

czy to dużo dodać do małej aplikacji WPF Andreas? tj. powyżej i poza podejściem, które dał Mikael? (w jakim stopniu używałby młota do złamania nakrętki, by tak rzec tutaj?) – Greg

+0

zobacz moją edycję! ... –

+0

+1 Nie wiedziałem o tej bibliotece, ale na pewno będę o tym pamiętać. –

15

Zakładam, że już coś wypróbowałeś i że dryfuje.

Jeśli chcesz coś podpalić na przykład co 5 sekund od godziny (5, 10, 15, 20, 20), możesz ustawić timer tak, aby strzelał raz, a następnie w telefonie oddzwonić, zresetować minutnik, aby strzelić na DateTime.Now + liczba sekund do następnego 5 sekundowego okresu.

Zapobiegnie to dryfowaniu tak długo, jak zegar będzie prawidłowy.

Coś takiego

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

brzmi dobrze - myślę, że zastanawiałem się, czy nie było już to funkcja, która zrobi to już pochowany w .NET ramy gdzieś – Greg

Powiązane problemy