Planificador de tareas en C# (.NET): Quartz.NET y System.Threading.Timer

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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 Quartz


Ejemplo: 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

Recommendations