Quartz.NET para C# (.NET): Guía completa con ejemplos prácticos

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

Quartz.NET para C# (.NET): Guía completa para programar tareas

Quartz.NET es una potente, flexible y ampliamente utilizada librería de código abierto para la programación de tareas en aplicaciones .NET. Permite a los desarrolladores crear, gestionar y ejecutar trabajos en segundo plano según un horario definido. Si necesitas ejecutar código en un momento específico, con una periodicidad determinada o como respuesta a un evento (como los cron jobs en Linux), Quartz.NET es la solución ideal. Esta librería es un puerto del popular framework Java Quartz Scheduler.

¿Para qué sirve? En el desarrollo moderno, surgen tareas que no deben ejecutarse de forma síncrona en respuesta a una solicitud del usuario. Por ejemplo: envío de campañas de email, limpieza de archivos temporales, sincronización de datos con APIs externas, generación de informes, actualización de caché y mucho más. Quartz.NET ofrece un mecanismo robusto y tolerante a fallos para ejecutar estas tareas. Soporta la persistencia del estado de los trabajos en una base de datos (JobStore), lo que permite que sobrevivan a reinicios de la aplicación, y también admite clustering para distribuir la carga de trabajo.

A diferencia del uso simple de System.Threading.Timer o BackgroundService, Quartz.NET proporciona una API completa para gestionar el ciclo de vida de los trabajos, disparadores complejos (diario, semanal, mediante expresiones CRON), ejecución en paralelo, escucha de eventos y mucho más. Esto lo convierte en el estándar de facto para la programación de tareas en el ecosistema .NET.

Instalación

Quartz.NET se distribuye a través de NuGet. Para instalarlo, usa uno de los siguientes comandos en la consola del administrador de paquetes:

# Instalación del paquete principal
dotnet add package Quartz

# Si necesitas soporte para configuración XML
dotnet add package Quartz.Plugins

# Para usar con Dependency Injection (recomendado para ASP.NET Core)
dotnet add package Quartz.Extensions.Hosting

Para .NET Framework clásico (por ejemplo, .NET 4.8), usa la consola de NuGet:

Install-Package Quartz

Inicio rápido: Ejemplo mínimo funcional

Vamos a crear una aplicación de consola simple que muestre "¡Hola, Quartz!" cada 5 segundos.

using System;
using System.Threading.Tasks;
using Quartz;
using Quartz.Impl;

namespace QuartzQuickStart
{
    // 1. Creamos el Job (tarea)
    public class HelloJob : IJob
    {
        public async Task Execute(IJobExecutionContext context)
        {
            await Console.Out.WriteLineAsync($"¡Hola, Quartz! Hora: {DateTime.Now:HH:mm:ss}");
        }
    }

    class Program
    {
        static async Task Main(string[] args)
        {
            // 2. Creamos la fábrica del planificador
            StdSchedulerFactory factory = new StdSchedulerFactory();

            // 3. Obtenemos el planificador
            IScheduler scheduler = await factory.GetScheduler();

            // 4. Iniciamos el planificador
            await scheduler.Start();

            // 5. Definimos el trabajo (Job)
            IJobDetail job = JobBuilder.Create()
                .WithIdentity("miTrabajo", "grupo1")
                .Build();

            // 6. Definimos el disparador (horario)
            ITrigger trigger = TriggerBuilder.Create()
                .WithIdentity("miDisparador", "grupo1")
                .StartNow()
                .WithSimpleSchedule(x => x
                    .WithIntervalInSeconds(5)
                    .RepeatForever())
                .Build();

            // 7. Registramos el trabajo y el disparador en el planificador
            await scheduler.ScheduleJob(job, trigger);

            // 8. Esperamos para que la consola no se cierre
            await Task.Delay(TimeSpan.FromSeconds(30));

            // 9. Detenemos el planificador
            await scheduler.Shutdown();
        }
    }
}

Clases, métodos e interfaces principales

Recommendations