Ejecución de tareas con HangFire

¿Qué rayos es Hangfire y por qué debería importarte?

Hangfire es una librería para .NET que te permite ejecutar tareas en segundo plano de forma fácil, confiable y sin dolor de cabeza.

Es como tener un mayordomo que se encarga de hacer las tareas sucias mientras tu aplicación sigue atendiendo a los usuarios.

Con Hangfire puedes:

  • Lanzar tareas una sola vez, de inmediato o con retraso.
  • Programar tareas recurrentes tipo cron.
  • Encadenar tareas (sí, puedes hacer workflows 😎).
  • Ver todo en un dashboard web.

Y lo mejor: sin necesidad de Windows Services, ni procesos externos, ni hacks con Task.Run(). Solo .NET, un poco de magia y listo.

¿Por qué no simplemente usar un Thread.Sleep()?

Ah, la vieja confiable. Claro, podrías usar Thread.Sleep(), Timer, o incluso un while(true) con await Task.Delay()… si lo que quieres es construir una bomba de tiempo en tu app 💣.

¿El problema?

  • Bloqueas el hilo y tu app se vuelve una tortuga. 🐢
  • No hay control, no hay logs, no hay dashboard.
  • No es escalable ni confiable.
  • Si el servidor se cae, chao tarea.

¿Ves por qué Hangfire es el camino? 😉

Instalación de Hangfire en 3 minutos (o menos, si tienes café ☕)

  1. Abre tu terminal o consola del package manager.
  2. Instala el paquete mágico:
dotnet add package Hangfire
dotnet add package Hangfire.AspNetCore
  1. (Opcional pero recomendado) Si vas a guardar tareas en base de datos, instala el provider para SQL Server:
dotnet add package Hangfire.SqlServer

Sí, así de fácil. No hay excusa.

Configurando el motor: Startup.cs y lo que no debes olvidar

En tu clase Startup.cs o donde configures los servicios:

public void ConfigureServices(IServiceCollection services)
{
    services.AddHangfire(config =>
        config.UseSqlServerStorage("TuConnectionString")); // Usa tu propia connection string

    services.AddHangfireServer();
}

Y en el método Configure:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    app.UseHangfireDashboard(); // Habilita el dashboard

    // Opcional: restringir acceso
    app.UseHangfireDashboard("/hangfire", new DashboardOptions
    {
        Authorization = new[] { new MyAuthorizationFilter() }
    });
}

Listo, Hangfire está vivo. ⚡

Tipos de tareas que puedes ejecutar (y cómo no romper nada)

🔥 Fire-and-forget

BackgroundJob.Enqueue(() => Console.WriteLine("Hola desde Hangfire!"));

Ejecuta una vez, de inmediato. Ideal para tareas como enviar un email, procesar datos, etc.

⏰ Recurring jobs

RecurringJob.AddOrUpdate(
    "job-diario",
    () => Console.WriteLine("Ejecutado todos los días"),
    Cron.Daily);

Sí, puedes usar expresiones tipo CRON. Y sí, puedes hacer que algo se ejecute cada minuto si eres masoquista.

⌛ Delayed jobs

BackgroundJob.Schedule(
    () => Console.WriteLine("Tarea con retraso"),
    TimeSpan.FromMinutes(5));

Se ejecuta una vez, pero en el futuro. Como los buenos memes.

🔗 Continuations

var jobId = BackgroundJob.Enqueue(() => Metodo1());
BackgroundJob.ContinueJobWith(jobId, () => Metodo2());

Porque a veces necesitas que una tarea termine para que empiece otra.

Dashboard de Hangfire: el lugar donde todo se ve bonito (hasta que falla 😅)

Accede a http://localhost:5000/hangfire (o el puerto que uses). Desde ahí puedes:

✅ Ver qué tareas se ejecutaron
🕒 Ver tareas programadas
🛠️ Reintentar errores
🗑️ Borrar jobs fallidos

Es como el «Task Manager» de tus tareas en segundo plano. Y sí, es adictivo.

Ejemplos prácticos que sí funcionan (probados por humanos, no por IA)

Enviar un email

BackgroundJob.Enqueue(() => emailService.Send("hola@tucorreo.com", "¡Hola!", "Mensaje de prueba"));

Procesar una imagen

BackgroundJob.Enqueue(() => imageProcessor.Resize("imagen.jpg"));

Generar reportes diarios

RecurringJob.AddOrUpdate(() => reporteService.Generar(), Cron.Daily);

Errores comunes que todos hemos cometido (y cómo arreglar el desastre)

  • ❌ No registraste el servidor de Hangfire (AddHangfireServer())
  • ❌ Estás usando una base de datos inestable (bye SQLite…)
  • ❌ Estás inyectando servicios con scoped en un job estático
  • ❌ Te olvidaste de manejar excepciones en tus métodos

Y sí, todo esto lo aprendí a la mala 😅

Consejillos para producción: Hangfire no es magia, es ingeniería

  • Usa un almacenamiento persistente (SQL Server, Redis, etc)
  • Protege el dashboard, no dejes /hangfire público 🙈
  • Usa logs y retries para tareas críticas
  • Configura time-outs y excepciones personalizadas

Conclusión: ¿Vale la pena usar Hangfire o sigo con mi script de consola?

Mira… si estás haciendo algo más complejo que un «Hola Mundo«, sí, vale la pena. Hangfire te da:

✅ Simplicidad
✅ Fiabilidad
✅ Dashboard bonito
✅ Escalabilidad

Y todo con una curva de aprendizaje suavecito. Así que ya sabes: ¡pon a Hangfire a trabajar mientras tú tomas un café! ☕

Deja un comentario