c# .net scheduling timer

¿Hay una clase de temporizador en C#que no está en el espacio de nombres Windows.Forms?



.net scheduling (6)

System.Diagnostics.Stopwatch si su objetivo es medir el tiempo que tarda algo en ejecutarse

Quiero usar un temporizador en mi aplicación .NET simple escrita en C #. El único que puedo encontrar es la clase Windows.Forms.Timer. No quiero hacer referencia a este espacio de nombres solo para mi aplicación de consola.

¿Existe una clase de temporizador C (o temporizador) para usar en aplicaciones de consola?


Recomendaría la clase Timer en el System.Timers nombres System.Timers . También de interés, la clase Timer en el System.Threading nombres System.Threading .

using System; using System.Timers; public class Timer1 { private static Timer aTimer = new System.Timers.Timer(10000); public static void Main() { aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); aTimer.Enabled = true; Console.WriteLine("Press the Enter key to exit the program."); Console.ReadLine(); } // Specify what you want to happen when the Elapsed event is // raised. private static void OnTimedEvent(object source, ElapsedEventArgs e) { Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime); } }

Ejemplo de documentos de MSDN.


Hay al menos las clases System.Timers.Timer y System.Threading.Timer que conozco.

Sin embargo, hay que tener cuidado (si aún no lo has hecho antes), decir si ya tienes el espacio de nombres System.Threading en tu cláusula de uso, pero en realidad quieres usar el temporizador en System.Timers necesitas hacer esto :

using System.Threading; using Timer = System.Timers.Timer;

Jon Skeet tiene un artículo sobre Timers en su guía de subprocesos múltiples, vale la pena leerlo: http://www.yoda.arachsys.com/csharp/threads/timers.shtml


Se recomienda no utilizar la clase de temporizador de System.Timer .



Esta pregunta es antigua y las respuestas existentes cubren bien el problema tal como estaba en ese momento. Mientras tanto, algo nuevo ha sucedido.

Timer, seguro, ¿para qué?

Usar un temporizador es una forma de ejecutar algún procesamiento con cierto retraso y / o intervalo regular. Hay dos casos:

(1) es solo para ejecutar un código corto periódicamente sin ningún tipo de preocupación, sin problemas, sin problemas. Si el temporizador simple de Windows Forms no es adecuado, System.Timers.Timer con su propiedad SynchronizingObject hace más sencillo que System.Threading.Timer .

(2) lo que está codificando está en el ámbito del procesamiento concurrente asincrónico. Eso ha sido tradicionalmente propenso a errores, difícil de depurar, para hacer las cosas bien, sea lo que sea que haya usado el temporizador simple.

En el caso 2, puede salirse con la suya con el enfoque tradicional, pero tenga cuidado, la complejidad acecha y está lista para comer no solo una vez, sino que en cualquier momento simplemente no toma la mejor decisión, con efectos acumulativos.

Ahora tenemos algo mejor

Si su situación se relaciona con algún tipo de manejo de "eventos" (cualquiera que sea su forma de codificación: pulsaciones de teclas, botones del mouse, bytes de un puerto serie, de una conexión de red, de mediciones, etc.), debe considerar la Programación Reactiva.

En los últimos años, la Programación reactiva de alguna manera ha descubierto cómo codificar estas situaciones, sin caer en trampas de complejidad.

Entonces, técnicamente el siguiente enlace es una respuesta a la pregunta: es un temporizador que está en el System.Reactive.Linq nombres System.Reactive.Linq : Método Observable.Timer (System.Reactive.Linq)

Para ser justos, es un temporizador que viene y juega bien con la mentalidad de Programación Reactiva y muchas cosas que cambian el juego. Sin embargo, podría ser o no la mejor herramienta, según el contexto.

Dado que esta pregunta está centrada en .NET, es posible que le interese una buena introducción al .NET Reactive Framework

O para un documento claro, ilustrado, más general (no centrado en Microsoft), esto parece bueno. La introducción a la Programación Reactiva te ha estado perdiendo .