visual timers threading studio net ejemplo c# multithreading timer

c# - studio - System.Timers.Timer/Threading.Timer vs Thread con WhileLoop+Thread.Sleep para tareas periĆ³dicas



timers timer vb net (4)

En mi solicitud, tengo que enviar latidos periódicos a una aplicación "hermana".

¿Se logra esto mejor con System.Timers.Timer / Threading.Timer o mediante el uso de un Thread con un bucle while y un Thread.Sleep?

El intervalo de latido es de 1 segundo.

while(!exit) { //do work Thread.Sleep(1000); }

o

myTimer.Start( () => { //do work }, 1000); //pseudo code (not actual syntax)...


Descubrí que la única implementación del temporizador que realmente escala es System.Threading.Timer . Todas las otras implementaciones parecen bastante falsas si se trata de un número no trivial de elementos programados.


Ninguno :)

El sueño suele ser mal visto (desafortunadamente no puedo recordar los detalles, pero por un lado, es un "bloque" ininterrumpible), y los Timer vienen con una gran cantidad de equipaje. Si es posible, recomendaría System.Threading.AutoResetEvent como tal

// initially set to a "non-signaled" state, ie will block // if inspected private readonly AutoResetEvent _isStopping = new AutoResetEvent (false); public void Process() { TimeSpan waitInterval = TimeSpan.FromMilliseconds (1000); // will block for ''waitInterval'', unless another thread, // say a thread requesting termination, wakes you up. if // no one signals you, WaitOne returns false, otherwise // if someone signals WaitOne returns true for (; !_isStopping.WaitOne (waitInterval); ) { // do your thang! } }

El uso de AutoResetEvent (o su primo ManualResetEvent ) garantiza un verdadero bloqueo con señalización segura para subprocesos (para cosas como la terminación elegante anterior). En el peor de los casos, es una mejor alternativa para Sleep

Espero que esto ayude :)


System.Threading.Timer tiene mi voto.

Temporizador System.Timers.Timer está diseñado para ser utilizado en el servidor (su código se ejecuta como un servidor / servicio en una máquina host en lugar de ser ejecutado por un usuario).

Un hilo con un bucle While y un comando Thread.Sleep es realmente una mala idea, dada la existencia de mecanismos de temporización más robustos en .NET.


Los temporizadores de servidor son una criatura diferente a los hilos de dormir.

Por un lado, en función de la prioridad de su hilo y de lo que se está ejecutando, su hilo de dormir puede o no estar activado y programado para ejecutarse en el intervalo que usted solicite. Si el intervalo es lo suficientemente largo y la precisión de la programación realmente no importa, Thread.Sleep() es una opción razonable.

Los temporizadores, por otro lado, pueden elevar sus eventos en cualquier hilo, permitiendo mejores capacidades de programación. Sin embargo, el costo de usar temporizadores es un poco más complejo en su código, y el hecho de que no pueda controlar qué hilo ejecuta la lógica a la que se dispara el evento del temporizador. De la documentación:

El temporizador basado en servidor está diseñado para usarse con subprocesos de trabajo en un entorno de multiproceso. Los temporizadores de servidor pueden moverse entre los hilos para manejar el evento Elapsed elevado, lo que resulta en una mayor precisión que los temporizadores de Windows para elevar el evento a tiempo.

Otra consideración es que los temporizadores invocan a su delegado transcurrido en un hilo de ThreadPool. Dependiendo de la cantidad de tiempo y / o la complejidad de su lógica, es posible que no desee ejecutarla en el grupo de subprocesos; es posible que desee un subproceso dedicado. Otro factor relacionado con los temporizadores es que si el procesamiento demora lo suficiente, el evento del temporizador puede volver a activarse (simultáneamente) en otro subproceso, lo que puede ser un problema si el código que se está ejecutando no está diseñado ni estructurado para la concurrencia.

No confunda los temporizadores de servidor con los " temporizadores de Windows ". El último generalmente se refiere a los mensajes WM_TIMER que pueden enviarse a una ventana, lo que permite que una aplicación programe y responda al procesamiento temporizado en su hilo principal sin dormir. Sin embargo, los temporizadores de Windows también pueden referirse a la API de Win para la sincronización de bajo nivel (que no es lo mismo que WM_TIMER).