2010-07-21 1 views
7

Gibt es in C# einen .NET-Timer, der sicherstellen kann, dass zwischen den Ereignissen keine Drift auftritt? Das heißt, wenn Sie einstellen, dass der Timer alle X Sekunden ausgeht, wird er nach Tagen des Betriebs nicht driften, d. H. Um sicherzustellen, dass die Annäherungsanzahl von X Sekunden Ereignissen an einem Tag synchron mit dem bleibt, was er sein sollte?C# -Zeitgeber, der alle X Sekunden ausgelöst wird, aber synchron mit der Echtzeit bleibt (d. H. Ohne Drift)

Wenn nicht, gibt es ein bekanntes Codebeispiel, das eine Timer-Funktion in C# umschließt?

Antwort

6

leid für Sie nur geben, einen Link zu quartz.net, aber dies ist ein voll qualifizierten, Unternehmen, getestet, ... Bibliothek ... Sie brauchen nicht die neu zu erfinden Rad :)

Wenn Sie sich über Overhead kümmern, was ist Ihre Definition für Overhead? ist es die Dateigröße (Binärdateien sind etwa 0,5 MB) oder der Overhead in der Logik. gut für den Logikteil: Ich denke, dass die Implementierung ihrer IJob-Schnittstelle einen guten Job macht, um besseren Code des Verbrauchers zu erzwingen. Ich bin nicht so ein großer Freund von Inline-Methoden (nur als Beispiel, wie Sie ihre Zeiger auf Timer abfeuern könnten) - Klassen würden Ihnen viel mehr Möglichkeiten geben, und noch einmal, zwingen Sie besser oop, Domain-Design, .. .

aber: - ich glaube, ich habe mich gefragt, ob es nicht bereits eine Funktion war, die in der .NET dies bereits begraben tun würde Console.WriteLine(...) mit quartz.net Overkill ... :)

+0

fügt es viel Overhead zu einer kleinen WPF App Andreas hinzu? d. h. über und jenseits des Ansatzes, den Mikael gegeben hat? (d. h. in welchem ​​Umfang würde es einen Vorschlaghammer verwenden, um hier eine Nuss zu knacken?) – Greg

+0

siehe meine Bearbeitung! ... –

+0

+1 Ich wusste nichts über diese Bibliothek, aber ich werde es mir merken. –

15

Ich nehme an, Sie haben bereits etwas versucht, und dass es driftet.

Wenn Sie möchten, dass alle 5 Sekunden (5,10,15,20 ..) alle 5 Sekunden ausgelöst werden, können Sie den Timer so einstellen, dass er einmal ausgelöst wird. Setzen Sie den Timer zurück, um zu feuern DateTime.Now + Anzahl der Sekunden bis zum nächsten 5-Sekunden-Intervall.

Dies würde verhindern, dass es zu Driften kommt, solange Ihre Uhr korrekt ist.

So etwas

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

klingt gut wäre, zu tun Framework irgendwo – Greg

Verwandte Themen