Colas de tareas para C# (.NET): de lo simple a lo complejo
El desarrollo moderno en C# (.NET) rara vez prescinde de tareas en segundo plano, procesamiento diferido y operaciones asíncronas. Las colas de tareas (Job Queues / Message Queues) son un patrón clave que permite descargar el hilo principal de la aplicación, garantizar la entrega de mensajes y escalar el procesamiento. En este artículo, revisaremos tres enfoques populares para implementar colas en .NET: el integrado System.Threading.Channels, el potente planificador Hangfire y el broker de mensajes industrial RabbitMQ con su cliente para .NET.
1. System.Threading.Channels — cola integrada en .NET
System.Threading.Channels es una cola ligera y segura para subprocesos, disponible directamente en .NET (desde .NET Core 2.1). Es ideal para escenarios de «productor-consumidor» dentro de un mismo proceso.
Características principales:
- Lectura y escritura asíncronas (
await writer.WriteAsync(),await reader.ReadAsync()). - Canales limitados e ilimitados (Bounded / Unbounded).
- Soporte de cancelación mediante
CancellationToken. - Lectura por lotes (
ReadAllAsync).
Ejemplo: cola de tareas simple
using System.Threading.Channels;
// Creamos un canal con un buffer de 100 elementosvar channel = Channel.CreateBounded<string>(100);
// Productor: agregamos tareasvar producer = Task.Run(async () =>{ for (int i = 0; i < 10; i++) { await channel.Writer.WriteAsync($"Tarea {i}"); await Task.Delay(100); } channel.Writer.Complete(); // señal de finalización});
// Consumidor: procesamos las tareasvar consumer = Task.Run(async () =>{ await foreach (var item in channel.Reader.ReadAllAsync()) { Console.WriteLine($"Procesado: {item}"); }});
await Task.WhenAll(producer, consumer);Ventajas: cero dependencias, alto rendimiento, ideal para colas en memoria dentro de una misma aplicación.
Desventajas: no es adecuado para sistemas distribuidos: los datos se pierden al reiniciar.
2. Hangfire — planificador avanzado de tareas en segundo plano
Hangfire es una biblioteca popular para .NET que no solo implementa una cola, sino que también proporciona un panel web, persistencia (SQL Server, Redis, PostgreSQL), reintentos y programación CRON.
Características clave:
- Fire-and-forget (ejecución única).
- Tareas diferidas (Delayed).
- Tareas recurrentes (Recurring) — reemplazo del Programador de tareas de Windows.
- Reintentos automáticos con política configurable.
- Monitoreo integrado (panel).
Ejemplo: configuración básica de Hangfire
// Instalación: Install-Package Hangfireusing Hangfire;using Hangfire.SqlServer;
// Configuración en Program.cs (.NET 6+)var builder = WebApplication.CreateBuilder(args);builder.Services.AddHangfire(config => config.UseSqlServerStorage(builder.Configuration.GetConnectionString("HangfireDb")));builder.Services.AddHangfireServer();
var app = builder.Build();app.UseHangfireDashboard(); // /hangfire
// Agregar tareasBackgroundJob.Enqueue(() => Console.WriteLine("¡Fire-and-forget!"));BackgroundJob.Schedule(() => Console.WriteLine("En 5 minutos"), TimeSpan.FromMinutes(5));RecurringJob.AddOrUpdate("my-job", () => Console.WriteLine("Cada minuto"), Cron.Minutely);
app.Run();Ventajas: funcionalidad rica, persistencia del estado entre reinicios, interfaz de usuario lista.
Desventajas: requiere una base de datos, no es adecuado para sistemas distribuidos de alta carga (diseñado para monolitos).
3. RabbitMQ + .NET — cola de mensajes distribuida
RabbitMQ
También en la biblioteca
Recommendations