Temporizador de C # que dispara cada X segundos, pero permanece en sincronización con tiempo real (es decir, sin deriva)

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

  •  18-09-2020
  •  | 
  •  

Pregunta

¿Hay un temporizador de .NET disponible en C # que puede asegurarse de que no haya "deriva" entre los eventos?Es decir, si configura el temporizador para desaparecer cada X segundos, que después de que los días de operación no se desvíe, es decir, para garantizar que el número de enfoque de X segundos eventos en un día permanezca en sincronización con lo que debería ser?

Si no, ¿hay un ejemplo de código bien conocido que envolvería una función de temporizador en C # para hacer esto?

¿Fue útil?

Solución

Perdón por solo darle un enlace a cuarzo.net , pero esta es una empresa totalmente calificada., probado, ... Biblioteca ... No necesita reinventar la rueda :)

Si te preocupa por encima de la cabeza, ¿cuál es su definición para la sobrecarga?¿Es el tamaño del archivo (los binarios son aproximadamente 0,5 MB) o la sobrecarga en la lógica? Bueno para la parte lógica: creo que la implementación de su interfaz de IJob hace un buen trabajo para forzar un mejor código del consumidor.No soy tan amigo de los métodos en línea (igual que un ejemplo, ya que podría incendiar sus punteros sobre el desempeño del temporizador): las clases le darían muchas más posibilidades, y una vez más, forzaran mejor OOP, diseño de dominio, ...

Pero: Haciendo Console.WriteLine(...) con cuarzo.net estaría exagerado ... :)

Otros consejos

Supongo que ya ha intentado algo, y que se desvía.

Si quieres que se incendie algo a decir cada 5 segundos desde la hora (5,10,15,20 ..), podría configurar su temporizador para disparar una vez, luego en su devolución de llamada, reinicie el temporizador para disparar en DateTime. Ahora + número de segundos en el siguiente intervalo de 5 segundos.

Esto evitaría que cualquier deriva siempre que su reloj sea correcto.

algo como este

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top