2008-09-29 10 views
5

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.Temporizadores .NET: ¿Cuál es la mejor manera de recibir notificaciones en X segundos?

El hecho de que los temporizadores son inherentes recurrentes 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?

¿Alguien puede 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?

Respuesta

10

Este constructor para System.Threading.Timer le permite especificar un período de . 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 
) 
+0

!!! Santa mierda Ben, nunca lo supo, ¿tienes todos los msdn memorizados o algo –

+0

? Tampoco lo sabía. Siempre encontré QTimer QTimer :: singleshot más fácil, pero es bueno saber que el BCL Timer puede hacer esto :) – OregonGhost

+0

Sí, lo leí todas las noches antes de acostarme :-) –

5

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

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

+0

Ya he reflexionado sobre esta opción, pero tengo curiosidad acerca de la fiabilidad y tal –

2

Girar un nuevo BackgroundWorker, dormir, cerrar.

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

que es una solución interesante ... –

+0

Esto ocupará un procesador de 30000 ms, ¿no? –

+0

@Nency - no, no lo creo, el hilo de fondo debe estar dormido y no utilizar ningún tiempo de CPU. – RickL

0

simplemente la puso a tick después de X segundos, y en el código de la garrapata, hacer:

Timer.Enabled = false;

funcionó para mí.

0

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

1

Puede utilizar 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 deshacerse de 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.

Cuestiones relacionadas