Temporizadores .NET: ¿Cuál es la mejor manera de recibir notificaciones en X segundos?

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

  •  02-07-2019
  •  | 
  •  

Pregunta

Supongamos que tengo un evento no recurrente que debe generarse X segundos a partir de ahora, como un tiempo de espera. Intuitivamente, tendría sentido crear un System.Timers.Timer, establecer su intervalo en X * 1000, conectar su tic al evento e iniciarlo. Dado que este es un evento no recurrente y solo desea que se genere una vez, tendrá que detener el temporizador después de que se active.

El hecho de que los temporizadores sean inherentemente recurrentes, sin embargo, me hace desconfiar si esta es realmente la mejor manera de hacerlo. ¿Sería mejor / más preciso / más seguro guardar el tiempo iniciado, configurar el temporizador para que marque cada segundo (o incluso milisegundos) y al marcar el sistema por tiempo y elevar manualmente el evento objetivo solo una vez que haya transcurrido el tiempo requerido?

¿Puede alguien opinar sobre cuál de los dos métodos es el mejor (tal vez hay otra opción en la que no pensé también). ¿Un método se vuelve mejor que el otro si el intervalo de tiempo que necesito esperar se mide en milisegundos?

¿Fue útil?

Solución

Este constructor para el System.Threading.Timer le permite para especificar un período . Si establece este parámetro en -1, deshabilitará la señalización periódica y solo se ejecutará una vez.

public Timer(
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
)

Otros consejos

simplemente use un temporizador normal y desactívelo después de que haya transcurrido una vez. eso debería resolver tu problema.

ambos, system.threading.timer y system.timers.timer son compatibles con esto.

Gire un nuevo BackgroundWorker, duerma, cierre.

var worker = new BackgroundWorker();
worker.DoWork += delegate {
  Thread.Sleep(30000); 
  DoStuff();
} 
worker.RunWorkerAsync();

Puedes usar un System.Timers.Timer con AutoReset = true, o un System.Threading.Timer con un período infinito (System.Threading.Timeout.Infinite = -1) para ejecutar un temporizador una vez.

En cualquier caso, debes desechar tu temporizador cuando hayas terminado (en el controlador de eventos para un Timers.Timer o la devolución de llamada para un Threading.Timer) si no tienes un intervalo recurrente.

solo configúralo para que marque después de X segundos, y en el código de la marca, haz:

timer.enabled = false;

funcionó para mí.

Si desea una medida de tiempo precisa, debe considerar duplicar la frecuencia del temporizador y usar DateTime.Now para comparar con su hora de inicio. Timers and Thread.Sleep no son necesariamente exactos en sus mediciones de tiempo.

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