C # Timer che spara ogni x secondi, ma rimane in sincrocia con tempo reale (cioè senza deriva)

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

  •  18-09-2020
  •  | 
  •  

Domanda

C'è un timer .NET disponibile in C # che può garantire che non vi sia alcun "deriva" tra gli eventi?Cioè, se si imposta il timer per scendere ogni x secondi, che dopo giorni di funzionamento non verrà alla deriva, vale a dire per garantire che il numero di approccio degli eventi di X secondi in un giorno rimane in sincronia con ciò che dovrebbe essere?

.

In caso contrario, è presente un esempio di codice ben noto che avvolgerà una funzione timer in C # per fare questo?

È stato utile?

Soluzione

Scusa per averti solo un link a QUARZ.NET , ma questa è un'impresa pienamente qualificata, testato, ... Biblioteca ... Non è necessario reinventare la ruota :)

Se ti preoccupi del sovraccarico, qual è la tua definizione per il sovraccarico?È la dimensione del file (i binari sono circa 0,5 MB) 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 migliore codice del consumatore.Non sono quel grande amico di metodi in linea (solo come esempio, come potresti sparare i loro puntatori su Timer Essapse) - le lezioni ti darà molte più possibilità, e ancora una volta, costringe meglio oop, design del dominio, ...

Ma: fare Console.WriteLine(...) con quarzo.net sarebbe eccessivo ... :)

Altri suggerimenti

Suppongo che tu abbia già provato qualcosa, e che la deriva.

Se vuoi qualcosa di sparare a dire ogni 5 secondi dall'ora (5,10,15,20 ..), è possibile impostare il timer per sparare una volta, quindi nella tua callback, resettare il timer per sparare a DateTime. Ora + numero di secondi al prossimo 5 secondi intervalli.

Ciò impedirebbe a sviluppare la deriva finché il tuo orologio è corretto.

Qualcosa come questo

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();
}
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top