El blog del burgués

15 febrero 2010

Usando Threads en C#.NET: Timers

Filed under: C# — elburgues @ 11:54 PM
Tags:

La forma más fácil de ejecutar un método periódicamente es mediante un temporizador, como la clase Timer del espacio de nombres System.Threading. Se trata de de una clase bastante simple, con un constructor y solo dos métodos. En el siguiente ejemplo, un temporizador llama al método Tick el cual escribe “tick…” después de que hayan pasado 5 segundos por primera vez, haciéndolo luego cada segundo, hasta que el usuario presione la tecla “enter”:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
namespace Timers
{
    class Program
    {
        static void Main()
        {
            Timer tmr = new Timer(Tick, "tick...", 5000, 1000);
            Console.ReadLine();
            // Libera todos los recursos utilizados por la instancia actual de System.Threading.Timer.
            tmr.Dispose();
        }
        static void Tick(object data)
        {
            // Esto se ejecuta en un hilo combinado
            Console.WriteLine(data); // Escribe "tick..."
        }
    }
}

.NET framework tiene otra clase timer con el mismo nombre, pero en el espacio de nombres System.Timers. Ésta clase es simplemente un envoltorio de la de la clase System.Threading.Timer, proporcionando comodidad adicional e idéntico motor subyacente. Un resumen de las características añadidas podría ser éste:

  • Al tener una implementación como componente, puede ser situado en el diseñador de visual studio.
  • Tiene una propiedad Interval en vez de un método Change.
  • Tiene un evento Elapsed en vez de un delegado callback.
  • Tiene una propiedad Enabled para arrancar/parar el temporizador.
  • Tiene los métodos Star/Stop, también para lo mismo.
  • Tiene un flag de AutoReset para indicar un evento recurrente.

Un ejemplo de uso:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Timers;
namespace Timers
{
    class SystemTimer
    {
        static void Main()
        {
            Timer tmr = new Timer(); //No requiere argumentos.
            tmr.Interval = 500;
            tmr.Elapsed += tmr_Elapsed; // Usa un evento en vez de un delegado.
            tmr.Start(); // Arranca el temporizador.
            Console.ReadLine();
            tmr.Stop(); // Pausa el temporizador.
            Console.ReadLine();
            tmr.Start(); // Reanuda el temporizador.
            Console.ReadLine();
            tmr.Dispose(); // Para el temporizador permanentemente.
        }
        static void tmr_Elapsed(object sender, EventArgs e)
        {
            Console.WriteLine("Tick");
        }
    }
}

Cuando se dispara el evento tmr_Elapsed, ‘e’ es rellenado con información del siguiente tipo:

 

.NET framework provee incluso con un tercer tipo de temporizador, en el espacio de nombres System.Windows.Forms. Siendo similar a System.Timers.Timer en su interfaz, es radicalmente diferente en un sentido funcional. Un System.Windows.Forms.Timer no utiliza subprocesamiento, eso quiere decir que su evento Elapsed se dispara siempre dentro del mismo hilo en el que originalmente fue creado el timer.

Suponiendo que este temporizador sea creado en el hilo principal de la aplicación, responsable de la instanciación de todos los formularios y controles de una aplicación “Windows Forms”, el evento es capaz de interactuar con los controles y formularios sin violar la seguridad de subprocesos. Se trata, en efecto, de un temporizador de un único subproceso. Por tanto, es importante que la ejecución del evento Elapsed sea rápida ya que, de otro modo, la interfaz de usuario no respondería, se quedaría bloqueada.

Anuncios

3 comentarios »

  1. Muy buena explicacion muchas y Gracias..!!!

    Comentario por Juan Manuel Limas — 1 septiembre 2010 @ 1:50 AM | Responder

  2. muy claro. Gracias

    Comentario por chelo — 15 octubre 2012 @ 7:44 PM | Responder

  3. hola muy buena la informacion, pero necesito saber si este timer me sirve para colocar dos en paralelo, porq necesito programar un timer para que se repita cada 100 milisegundos y otro cada 3 segundos. pero estoy usando el control timer de la windowsformapplication, y he notado un desfasaje en los tiempo q no puedo permitir. Es posible colocar dos timer en paralelos ??

    Comentario por Sujaira — 21 enero 2013 @ 4:40 PM | Responder


RSS feed for comments on this post.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s

Crea un blog o un sitio web gratuitos con WordPress.com.

A %d blogueros les gusta esto: