2010-07-21 9 views
7

Esiste un timer .NET disponibile in C# che possa garantire che non vi sia "deriva" tra gli eventi? Cioè, se si imposta il timer per spegnersi ogni X secondi, che dopo giorni di funzionamento non andrà alla deriva, cioè per garantire che il numero di avvicinamento degli eventi X secondi in un giorno rimanga sincronizzato con quello che dovrebbe essere?Timer C# che scatta ogni X secondi, ma rimane sincronizzato in tempo reale (cioè senza deriva)

In caso contrario, esiste un esempio di codice noto che consente di avvolgere una funzione timer in C# per eseguire questa operazione?

risposta

6

dispiace solo per darvi un link a quartz.net, ma questo è un completo, impresa, testato, ... libreria ... non c'è bisogno di reinventare la wheel :)

se ti preoccupi di sovraccarico, qual è la tua definizione per overhead? è la dimensione del file (i binari sono circa 0,5mb) o il sovraccarico nella logica. bene per la parte logica: penso che l'implementazione della loro interfaccia IJob faccia un buon lavoro per forzare un codice migliore del consumatore. non sono il grande amico dei metodi inline (solo per esempio, dato che potresti far scattare i loro puntatori sull'intervallo di tempo) - le classi ti darebbero molte più possibilità, e ancora una volta, forza meglio oop, design del dominio, .. .

ma: fare Console.WriteLine(...) con quartz.net sarebbe un errore ... :)

+0

aggiunge molto overhead a una piccola app WPF Andreas? cioè sopra e oltre l'approccio che Mikael ha dato? (cioè fino a che punto userebbe una mazza per rompere un dado per intenderci qui?) – Greg

+0

vedi la mia modifica! ... –

+0

+1 Non sapevo di questa biblioteca, ma certamente la terrò a mente. –

15

Suppongo che tu abbia già provato qualcosa e che vada alla deriva.

Se si desidera che si spari qualcosa ogni 5 secondi a partire dall'ora (5,10,15,20 ..), è possibile impostare il timer per sparare una volta, quindi nella richiamata, reimpostare il timer per sparare a DateTime.Now + numero di secondi all'intervallo successivo di 5 secondi.

Ciò impedirebbe qualsiasi deriva finché l'orologio è corretto.

Qualcosa di simile

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

suona bene - Credo che mi chiedevo se non ci fosse già una funzione che farebbe questo già sepolto in .NET framework da qualche parte – Greg

Problemi correlati