2012-09-21 18 views
115

Duplicar posible:
How do you add a timer to a C# console application¿Cuál es la mejor manera de implementar un "temporizador"?

¿Cuál es la mejor manera de implementar un temporizador? ¡Una muestra de código sería genial! Para esta pregunta, "mejor" se define como el más confiable (el menor número de fallas) y preciso. Si especifico un intervalo de 15 segundos, quiero que se invoque el método objetivo cada 15 segundos, no cada 10-20 segundos. Por otro lado, no necesito una precisión de nanosegundos. En este ejemplo, sería aceptable que el método se dispare cada 14.51 - 15.49 segundos.

+2

Otra gran pregunta que se marcó como duplicado sin ningún vínculo útil señalando el duplicado que explica muy bien – pixel

Respuesta

206

Utilice la clase Timer.

https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

public static void Main() 
{ 
    System.Timers.Timer aTimer = new System.Timers.Timer(); 
    aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); 
    aTimer.Interval=5000; 
    aTimer.Enabled=true; 

    Console.WriteLine("Press \'q\' to quit the sample."); 
    while(Console.Read()!='q'); 
} 

// Specify what you want to happen when the Elapsed event is raised. 
private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    Console.WriteLine("Hello World!"); 
} 

El evento Elapsed serán levantados cada X cantidad de milisegundos, especificado por la propiedad Interval en el objeto Timer. Se llamará al método Event Handler se especifica, en el ejemplo anterior es OnTimedEvent

+5

¿El temporizador se ejecutan en un hilo separado? –

+7

@VaughanHilts, respuesta corta, sí. Respuesta larga, revise [esta respuesta SO] (http: // stackoverflow.com/a/1436331/1630665) que explica en qué hilo transcurre el temporizador muy bien. –

+3

Quizás alguien con más privilegios que yo pueda editar esto: La propiedad Interval especifica el número de milisegundos, no los segundos entre los eventos. – Matthias

19

No está claro lo que tipo de aplicación que se va a desarrollar (de escritorio, web, consola ...)

El respuesta general, si está desarrollando la aplicación Windows.Forms, es el uso de

System.Windows.Forms.Timer clase. El beneficio de esto es que se ejecuta en el hilo UI, por lo que es simple simplemente defínala, suscríbete a su evento Tick y ejecuta tu código cada 15 segundos.

Si haces algo más, entonces formas de las ventanas (que no está claro a partir de la pregunta), puede elegir System.Timers.Timer, pero esta uno se ejecuta en otra hilo, por lo que si usted va a actuar sobre algunos elementos de la interfaz de el evento es Elapsed, debe administrarlo con acceso de "invocación".

26

Al usar la clase System.Windows.Forms.Timer puede lograr lo que necesita.

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer(); 


t.Interval = 15000; // specify interval time as you want 
t.Tick += new EventHandler(timer_Tick); 
t.Start(); 

void timer_Tick(object sender, EventArgs e) 
{ 
     //Call method 
} 

Al utilizar el método de detención() puede detener el temporizador.

t.Stop(); 
+1

Si tiene uno, puede simplemente arrastrar un control de temporizador a su formulario desde la Caja de herramientas y hace todo lo anterior por usted. –

+0

@RobSedgwick Sí, estoy de acuerdo contigo. podemos agregar control de temporizador a través de la caja de herramientas. Pero el enfoque que compartí es a través del tiempo de ejecución agregar temporizador. –

2

Referencia ServiceBase a su clase y poner el código a continuación en caso OnStart:

Constants.TimeIntervalValue = 1 (horas) .. Lo ideal es que debe establecer este valor en el archivo de configuración.

StartSendingMails = nombre de la función que desea ejecutar en la aplicación.

protected override void OnStart(string[] args) 
     { 
      // It tells in what interval the service will run each time. 
      Int32 timeInterval = Int32.Parse(Constants.TimeIntervalValue) * 60 * 60 * 1000; 
      base.OnStart(args); 
      TimerCallback timerDelegate = new TimerCallback(StartSendingMails); 
      serviceTimer = new Timer(timerDelegate, null, 0, Convert.ToInt32(timeInterval)); 
     } 
+0

-1 OP menciona una aplicación de consola; no hay ninguna razón para incluir las clases de servicio de Windows en esto. Especialmente cuando, para resolver el problema, está utilizando la misma clase de temporizador que la respuesta aceptada. – TarkaDaal

+3

esto se muestra en un servicio pero se aplica a cualquier código. NO mencionar a @TarkaDaal. la consola no se menciona en esta publicación. solo en el posible duplicado. –

Cuestiones relacionadas