AYUDA .NET

C# Timer (Cómo funciona para desarrolladores)

Actualizado 6 de marzo, 2024
Compartir:

Introducción

Las clases Timer en C# son potentes herramientas para programar la ejecución de código a intervalos especificados. Tanto si está desarrollando una aplicación Windows Form como una aplicación de consola, entender cómo utilizar un temporizador puede mejorar enormemente la funcionalidad de su aplicación. Este tutorial le guiará a través de los fundamentos del uso de temporizadores en C#, incluyendo cómo configurarlos, manejar sus eventos, y asegurarse de que se ejecutan sin problemas en su aplicación. También hablaremos de IronPDF para automatizar nuestra generación de PDF usando Timer en C#.

Introducción a las clases de temporizador en C#

C# Temporizador (Cómo Funciona Para Desarrolladores): Figura 1 - Clase Timer

C# ofrece varias clases de temporizadores, cada una adecuada para diferentes tareas y entornos. Las clases de temporizadores más utilizadas son System.Timers.Timer para temporizadores basados en servidor y System.Windows.Forms.Timer para aplicaciones Windows Forms. Entender el papel de los manejadores de eventos es crucial cuando se trabaja con clases de temporizador, ya que estos manejadores dictan las acciones realizadas en cada momento significativo dictado por el temporizador, como el tick o los intervalos de tiempo transcurridos del evento.

Configurar un nuevo temporizador

Configurar el intervalo de tiempo de tu temporizador es fundamental para su funcionamiento, ya que determina la frecuencia con la que se invocan los manejadores de eventos del temporizador y, por tanto, controla el ritmo de las funciones sensibles al tiempo de la aplicación. Para utilizar un temporizador en su aplicación C#, especialmente cuando desarrolle aplicaciones Windows Forms, comience añadiendo el componente System.Windows.Forms.Timer de la caja de herramientas a su formulario, o creando mediante programación un objeto temporizador para mayor flexibilidad.

var timer = new System.Timers.Timer(); //  utilizar un temporizador
timer.Interval = 2000; //  Establece el intervalo del temporizador para que marque cada 2 segundos
var timer = new System.Timers.Timer(); //  utilizar un temporizador
timer.Interval = 2000; //  Establece el intervalo del temporizador para que marque cada 2 segundos
Dim timer = New System.Timers.Timer() '  utilizar un temporizador
timer.Interval = 2000 '  Establece el intervalo del temporizador para que marque cada 2 segundos
VB   C#

Esta sencilla configuración crea un temporizador que marca cada 2 segundos. Sin embargo, para que el temporizador realice acciones, es necesario conectarlo a un controlador de eventos.

Manejar el Evento Transcurrido

Adjuntando un manejador de evento transcurrido al evento Elapsed de un System.Timers.Timer, te aseguras de que tu aplicación puede realizar tareas en cada intervalo, respondiendo eficazmente a los disparadores basados en tiempo. Este evento se activa cada vez que transcurre el intervalo del temporizador. Se adjunta un manejador a este evento para especificar lo que debe suceder cuando el temporizador hace tictac:

timer.Elapsed += OnTimedEvent;
timer.Elapsed += OnTimedEvent;
timer.Elapsed += OnTimedEvent
VB   C#

En el código anterior, OnTimedEvent es un método que defines que será llamado cada vez que el evento Elapsed del temporizador se active.

Creación de un controlador de eventos

Al definir un controlador de eventos de temporizador, se crea un método que se ejecuta en respuesta a los eventos de tictac del temporizador, lo que permite un control preciso sobre las acciones realizadas a intervalos predefinidos. Un manejador de eventos para el evento Elapsed de un temporizador típicamente se ve así:

static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
    Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime);
}
static void OnTimedEvent(Object source, System.Timers.ElapsedEventArgs e)
{
    Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime);
}
Shared Sub OnTimedEvent(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
	Console.WriteLine("The Elapsed event was raised at {0:HH:mm:ss.fff}", e.SignalTime)
End Sub
VB   C#

Este método simplemente imprime la hora actual en la consola cada vez que el temporizador transcurre, demostrando cómo responder al evento del temporizador.

Iniciar y detener el temporizador

Después de configurar el temporizador y su controlador de eventos, es necesario iniciar el temporizador. Esto se hace estableciendo su propiedad Enabled a true o llamando al método Start:

timer.Enabled = true; //  o timer.Start();
timer.Enabled = true; //  o timer.Start();
timer.Enabled = True '  o timer.Start();
VB   C#

Para detener el temporizador, puede establecer Enabled a false o llamar al método Stop. Esto es crucial para evitar que su aplicación ejecute operaciones innecesarias cuando no son necesarias.

Uso de temporizadores en una aplicación Windows Forms

El System.Windows.Forms.Timer es un valioso componente de formularios Windows diseñado para integrarse perfectamente con el modelo dirigido por eventos de las aplicaciones Windows Forms, facilitando acciones regulares sin comprometer la capacidad de respuesta de la interfaz de usuario.

Ejemplo: Añadir un temporizador a un formulario

En una aplicación Windows Forms, puede arrastrar un control de temporizador de la caja de herramientas a su formulario, o crearlo mediante programación de esta forma:

System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Interval = 1000; //  1 segundo
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start();
System.Windows.Forms.Timer myTimer = new System.Windows.Forms.Timer();
myTimer.Interval = 1000; //  1 segundo
myTimer.Tick += new EventHandler(TimerEventProcessor);
myTimer.Start();
Dim myTimer As New System.Windows.Forms.Timer()
myTimer.Interval = 1000 '  1 segundo
AddHandler myTimer.Tick, AddressOf TimerEventProcessor
myTimer.Start()
VB   C#

Aquí, TimerEventProcessor es un manejador de eventos que será llamado cada vez que ocurra el evento Tick, que es similar al evento Elapsed en System.Timers.Timer.

Gestión avanzada de temporizadores

Seguridad de los hilos con temporizadores

Cuando se trabaja con temporizadores, es crucial entender el modelo de subprocesos de su aplicación. El System.Timers.Timer y System.Threading.Timer ejecutan sus callbacks en un thread pool, permitiendo la ejecución en paralelo. Sin embargo, esto puede dar lugar a problemas de seguridad de hilos si el método de devolución de llamada modifica datos compartidos o interactúa con elementos de la interfaz de usuario. Para actualizar de forma segura los elementos de la interfaz de usuario desde la llamada de retorno de un temporizador, debe enviar la llamada al subproceso de la interfaz de usuario utilizando técnicas específicas para el tipo de aplicación (por ejemplo, utilizando Invoke o BeginInvoke en Windows Forms).

Cronometraje de alta precisión

Para aplicaciones que requieren una temporización de alta precisión (por ejemplo, aplicaciones multimedia o juegos)la clase System.Diagnostics.Stopwatch puede ser más apropiada que un temporizador para medir el tiempo transcurrido con gran precisión. Aunque no es un temporizador propiamente dicho, la clase Stopwatch puede utilizarse junto con un temporizador para conseguir mediciones precisas del tiempo.

Ejemplos prácticos

Ejemplo: Implementación de un temporizador de cuenta atrás

Un escenario común donde un temporizador es útil es la creación de un temporizador de cuenta atrás. Para ello, ajuste el intervalo del temporizador a un segundo. (1000 milisegundos) y disminuyendo un contador cada vez que transcurre el temporizador. Cuando el contador llega a cero, el temporizador se detiene, señalando el final de la cuenta atrás.

using System;
namespace CountdownApp
{
    class Program
    {
        static int countdownTime = 10; //  Cuenta atrás desde 10 segundos
//  public static void main
        public static void Main(string [] args)
        {
            StartCountdown();
            Console.ReadLine(); //  Evitar que la consola se cierre inmediatamente
        }
        static void StartCountdown()
        {
            var timer = new System.Timers.Timer(1000); //  Tick cada segundo, var timer
            timer.Elapsed += UpdateCountdown;
            timer.Enabled = true;
        }
//  public static void printtimes
        static void UpdateCountdown(Object source, System.Timers.ElapsedEventArgs e)
        {
            if (countdownTime > 0)
            {
                Console.WriteLine(countdownTime-- + " seconds remaining");
            }
            else
            {
                Console.WriteLine("Countdown finished!");
                ((System.Timers.Timer)source).Stop(); //  Detener el temporizador
            }
        }
    }
}
using System;
namespace CountdownApp
{
    class Program
    {
        static int countdownTime = 10; //  Cuenta atrás desde 10 segundos
//  public static void main
        public static void Main(string [] args)
        {
            StartCountdown();
            Console.ReadLine(); //  Evitar que la consola se cierre inmediatamente
        }
        static void StartCountdown()
        {
            var timer = new System.Timers.Timer(1000); //  Tick cada segundo, var timer
            timer.Elapsed += UpdateCountdown;
            timer.Enabled = true;
        }
//  public static void printtimes
        static void UpdateCountdown(Object source, System.Timers.ElapsedEventArgs e)
        {
            if (countdownTime > 0)
            {
                Console.WriteLine(countdownTime-- + " seconds remaining");
            }
            else
            {
                Console.WriteLine("Countdown finished!");
                ((System.Timers.Timer)source).Stop(); //  Detener el temporizador
            }
        }
    }
}
Imports System
Namespace CountdownApp
	Friend Class Program
		Private Shared countdownTime As Integer = 10 '  Cuenta atrás desde 10 segundos
'  public static void main
		Public Shared Sub Main(ByVal args() As String)
			StartCountdown()
			Console.ReadLine() '  Evitar que la consola se cierre inmediatamente
		End Sub
		Private Shared Sub StartCountdown()
			Dim timer = New System.Timers.Timer(1000) '  Tick cada segundo, var timer
			AddHandler timer.Elapsed, AddressOf UpdateCountdown
			timer.Enabled = True
		End Sub
'  public static void printtimes
		Private Shared Sub UpdateCountdown(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
			If countdownTime > 0 Then
'INSTANT VB WARNING: An assignment within expression was extracted from the following statement:
'ORIGINAL LINE: Console.WriteLine(countdownTime-- + " seconds remaining");
				Console.WriteLine(countdownTime & " seconds remaining")
				countdownTime -= 1
			Else
				Console.WriteLine("Countdown finished!")
				DirectCast(source, System.Timers.Timer).Stop() '  Detener el temporizador
			End If
		End Sub
	End Class
End Namespace
VB   C#

Este es el resultado del código anterior:

Temporizador C# (Cómo funciona para desarrolladores): Figura 2 - Salida del temporizador de cuenta atrás

Ejemplo: Programación de comprobaciones periódicas de la base de datos

Los temporizadores pueden utilizarse para realizar comprobaciones periódicas en una base de datos, como la consulta de nuevos datos o la limpieza de registros antiguos. Este ejemplo configura un temporizador para consultar una base de datos cada hora:

private static void SetupDatabaseCheckTimer()
{
    var timer = new System.Timers.Timer(3600000); //  Ajustar a 1 hora
    timer.Elapsed += CheckDatabase;
    timer.Enabled = true;
}
private static void CheckDatabase(Object source, System.Timers.ElapsedEventArgs e)
{
    //  Realice aquí operaciones con la base de datos
    Console.WriteLine("Database checked at " + e.SignalTime);
}
private static void SetupDatabaseCheckTimer()
{
    var timer = new System.Timers.Timer(3600000); //  Ajustar a 1 hora
    timer.Elapsed += CheckDatabase;
    timer.Enabled = true;
}
private static void CheckDatabase(Object source, System.Timers.ElapsedEventArgs e)
{
    //  Realice aquí operaciones con la base de datos
    Console.WriteLine("Database checked at " + e.SignalTime);
}
Private Shared Sub SetupDatabaseCheckTimer()
	Dim timer = New System.Timers.Timer(3600000) '  Ajustar a 1 hora
	AddHandler timer.Elapsed, AddressOf CheckDatabase
	timer.Enabled = True
End Sub
Private Shared Sub CheckDatabase(ByVal source As Object, ByVal e As System.Timers.ElapsedEventArgs)
	'  Realice aquí operaciones con la base de datos
	Console.WriteLine("Database checked at " & e.SignalTime)
End Sub
VB   C#

Introducción a IronPDF

IronPDF es especialmente elogiado por su facilidad de uso en la generación de archivos PDF a partir de HTML o URL, esencialmente permitiendo a su aplicación para "imprimir" cualquier Contenido HTML como documento PDF. Esto resulta increíblemente útil para generar informes, facturas o cualquier contenido web que deba presentarse en un formato estandarizado. IronPDF también admite funciones avanzadas como estilos CSS, JavaScript y fuentes personalizadas, lo que garantiza que los PDF generados mantengan la fidelidad del contenido web.

Instalación de IronPDF

Puede instalar IronPDF utilizando NuGet Package Manager ejecutando este comando:

Install-Package IronPdf

Ejemplo

Imagine que necesita generar un informe diario en formato PDF con datos actualizados cada día. Para simplificar, generaremos un informe HTML básico y lo convertiremos a PDF con IronPDF cada 24 horas. En tu aplicación C#, configurarás un System.Timers.Timer para que se active cada 24 horas. Es importante tener en cuenta que el intervalo se establece en milisegundos, por lo que 24 horas se representa como 24 * _60*_60 * 1000 milisegundos.

using System;
using System.Timers;
using IronPdf;
using Timer = System.Timers.Timer;
class Program
{
    static void Main(string [] args)
    {
        //  Programar el temporizador para 24 horas
        Timer timer = new Timer(24 * 60 * 60 * 1000);
        timer.Elapsed += OnTimedEvent;
        timer.AutoReset = true;
        timer.Enabled = true;
        Console.WriteLine("Press Enter to exit the program.");
        Console.ReadLine();
    }
    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        GeneratePdfReport();
    }
    private static void GeneratePdfReport()
    {
        var renderer = new HtmlToPdf();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Daily Report</h1><p>This is the automated daily report.</p>");
        string outputPath = $"f:\\DailyReport_{DateTime.Now:yyyyMMdd}.pdf";
        pdf.SaveAs(outputPath);
        Console.WriteLine($"Generated PDF report at {outputPath}");
    }
}
using System;
using System.Timers;
using IronPdf;
using Timer = System.Timers.Timer;
class Program
{
    static void Main(string [] args)
    {
        //  Programar el temporizador para 24 horas
        Timer timer = new Timer(24 * 60 * 60 * 1000);
        timer.Elapsed += OnTimedEvent;
        timer.AutoReset = true;
        timer.Enabled = true;
        Console.WriteLine("Press Enter to exit the program.");
        Console.ReadLine();
    }
    private static void OnTimedEvent(Object source, ElapsedEventArgs e)
    {
        GeneratePdfReport();
    }
    private static void GeneratePdfReport()
    {
        var renderer = new HtmlToPdf();
        var pdf = renderer.RenderHtmlAsPdf("<h1>Daily Report</h1><p>This is the automated daily report.</p>");
        string outputPath = $"f:\\DailyReport_{DateTime.Now:yyyyMMdd}.pdf";
        pdf.SaveAs(outputPath);
        Console.WriteLine($"Generated PDF report at {outputPath}");
    }
}
Imports System
Imports System.Timers
Imports IronPdf
Imports Timer = System.Timers.Timer
Friend Class Program
	Shared Sub Main(ByVal args() As String)
		'  Programar el temporizador para 24 horas
		Dim timer As New Timer(24 * 60 * 60 * 1000)
		AddHandler timer.Elapsed, AddressOf OnTimedEvent
		timer.AutoReset = True
		timer.Enabled = True
		Console.WriteLine("Press Enter to exit the program.")
		Console.ReadLine()
	End Sub
	Private Shared Sub OnTimedEvent(ByVal source As Object, ByVal e As ElapsedEventArgs)
		GeneratePdfReport()
	End Sub
	Private Shared Sub GeneratePdfReport()
		Dim renderer = New HtmlToPdf()
		Dim pdf = renderer.RenderHtmlAsPdf("<h1>Daily Report</h1><p>This is the automated daily report.</p>")
		Dim outputPath As String = $"f:\DailyReport_{DateTime.Now:yyyyMMdd}.pdf"
		pdf.SaveAs(outputPath)
		Console.WriteLine($"Generated PDF report at {outputPath}")
	End Sub
End Class
VB   C#

Salida

Una vez que ejecutes el código, mostrará la siguiente salida en la consola. Aquí he modificado el código para una salida rápida por lo que, utilizo un temporizador de 10 segundos.

C# Temporizador (Cómo funciona para desarrolladores): Figura 3 - Salida de la consola

Aquí está el PDF generado:

C# Temporizador (Cómo funciona para desarrolladores): Figura 4 - Informe PDF

Conclusión

C# Temporizador (Cómo funciona para desarrolladores): Figura 5 - Licencia

En conclusión, la integración de temporizadores C# con IronPDF presenta un potente enfoque para automatizar la generación y gestión de documentos PDF en aplicaciones .NET. A través de los ejemplos proporcionados, hemos explorado cómo configurar un temporizador en C# para activar tareas de generación de PDF a intervalos regulares, ya sea para realizar pruebas frecuentes o para la generación programada de informes.

Con los temporizadores de C#, podemos controlar con precisión cuándo se ejecutan nuestras tareas relacionadas con PDF, lo que permite realizar actualizaciones periódicas, generar informes o cualquier tarea que deba producirse según un calendario. IronPDF mejora esta capacidad proporcionando una forma directa y eficaz de crear, manipular y guardar documentos PDF basados en contenido dinámico, HTML o incluso páginas web.

IronPDF ofrece un prueba gratuita para que los desarrolladores exploren sus características, con licencias disponibles a partir de $749 para acceso completo y soporte. Esto proporciona una forma rentable de implantar funcionalidades PDF completas en sus aplicaciones .NET.

< ANTERIOR
Graphql C# (Cómo funciona para desarrolladores)
SIGUIENTE >
Math.Round C# (Cómo funciona para desarrolladores)

¿Listo para empezar? Versión: 2024.7 recién publicada

Descarga gratuita de NuGet Descargas totales: 9,974,197 Ver licencias >
123