temporizador studio programacion online móviles home google funciona desarrollo curso aplicaciones .net asynchronous timer

.net - studio - temporizador google home



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

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

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

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

El hecho de que Timers sea inherentemente recurrente, sin embargo, me hace desconfiar si esta es de hecho la mejor manera de hacerlo. ¿Sería mejor / más preciso / más seguro guardar el tiempo iniciado, configurar el temporizador para marcar cada segundo (o incluso milisegundos) y marcar el tiempo del sistema y subir 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 (quizás hay otra opción que tampoco pensé). ¿Un método se vuelve mejor que otro si el intervalo de tiempo que debo esperar se mide en milisegundos?


Puede 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, debe desechar su temporizador cuando haya terminado con él (en el controlador de eventos para un Timers.Timer o la devolución de llamada para un Threading.Timer) si no tiene un intervalo recurrente.


Si desea una medida de tiempo precisa, debe considerar doblar 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.


Spin off un nuevo BackgroundWorker, dormir, cerrar.

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


simplemente ajústelo para marcar después de X segundos, y en el código del tic, haga:

timer.enabled = false;

trabajó para mi.


simplemente use un temporizador normal y deshabilítelo una vez que haya transcurrido. eso debería resolver tu problema.

ambos, system.threading.timer y system.timers.timer soportan esto.