Planificador de tareas en C# (.NET): desde un temporizador simple hasta el industrial Quartz.NET
El planificador de tareas (Task Scheduler) es una parte esencial de cualquier aplicación seria. Ya sea la limpieza periódica de caché, el envío de correos electrónicos masivos o la sincronización de datos con una API externa, no se puede prescindir de un mecanismo confiable para ejecutar operaciones en segundo plano. En el ecosistema .NET, el desarrollador tiene varios enfoques disponibles: desde el incorporado System.Threading.Timer hasta el potente y flexible framework Quartz.NET. En este artículo, analizaremos ambas opciones, mostraremos ejemplos de código y ayudaremos a elegir la herramienta adecuada para su proyecto.
1. System.Threading.Timer incorporado
La forma más simple y ligera de ejecutar una tarea programada es usar System.Threading.Timer. No requiere la instalación de paquetes de terceros y es ideal para escenarios simples: ejecutar un método a intervalos fijos o con un retraso único.
Ejemplo: ejecutar una tarea cada 5 segundos
using System;using System.Threading;
class Program{ static void Main() { // Creamos un temporizador que ejecuta el callback cada 5 segundos Timer timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); Console.WriteLine("Temporizador iniciado. Presione Enter para salir."); Console.ReadLine(); timer.Dispose(); }
static void DoWork(object state) { Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] Ejecutando tarea en segundo plano..."); }}Ventajas:
- Incorporado en .NET, no necesita bibliotecas adicionales.
- Consumo mínimo de recursos.
- Facilidad de uso.
Desventajas:
- Sin soporte nativo para expresiones CRON.
- Difícil gestionar múltiples tareas con diferentes horarios.
- Sin mecanismos de persistencia (las tareas se pierden al reiniciar).
- El callback se ejecuta en un hilo del pool, posibles problemas de sincronización.
Para proyectos de aprendizaje y utilidades simples, System.Threading.Timer es una excelente opción. Sin embargo, para aplicaciones de producción con decenas de tareas, vale la pena considerar soluciones más avanzadas.
2. Quartz.NET — planificador de tareas industrial
Quartz.NET es un framework potente, flexible y maduro para la planificación de tareas en .NET. Está inspirado en el popular análogo de Java Quartz y admite:
- Expresiones CRON para horarios flexibles (cada dos horas, entre semana a las 9:00, etc.).
- Persistencia de tareas (guardado en base de datos).
- Clustering (varios servidores pueden ejecutar tareas).
- Manejo de tareas perdidas (misfire handling).
- Tareas secundarias y disparadores.
Instalación de Quartz.NET
Instale el paquete a través de NuGet:
dotnet add package QuartzEjemplo: tarea simple con horario CRON
using System;using System.Threading.Tasks;using Quartz;using Quartz.Impl;
class Program{ static async Task Main() { // Creamos el planificador StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); await scheduler.Start();
// Definimos la tarea (Job) IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("helloJob", "group1") .Build();
// Creamos el disparador: todos los días a las 10:30 a.m. ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0 30 10 ? * * *") // CRON: segundo, minuto, hora, día, mes, día de la semana .Build();
// Registramos la tarea con el disparador await scheduler.ScheduleJob(job, trigger);
Console También en la biblioteca
Accompanist para Kotlin: guía completa con ejemplos prácticos
Generación de PDF en TypeScript: bibliotecas, herramientas y ejemplos de código
Autorización y autenticación en PHP: Guía completa con ejemplos