Colas de tareas en C# (.NET): System.Threading.Channels, Hangfire y RabbitMQ

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

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

Recommendations