Colas de tareas para C# (.NET): desde primitivas básicas hasta soluciones industriales
La organización del procesamiento asíncrono de tareas es una de las tareas clave al desarrollar aplicaciones de alta carga en C#. En el ecosistema .NET existen varios enfoques: desde primitivas de sincronización integradas hasta potentes bibliotecas externas. En este artículo, revisaremos las principales herramientas para trabajar con colas de tareas, sus puntos fuertes y ejemplos de uso.
1. System.Threading.Channels — herramienta integrada de .NET
A partir de .NET Core 2.1, la biblioteca estándar incluye la clase System.Threading.Channels.Channel<T>. Esta es una cola segura para subprocesos, optimizada para escenarios productor-consumidor.
Características principales:
- Lectura y escritura asíncronas (
WriteAsync,ReadAsync) - Soporte para colas limitadas e ilimitadas
- Posibilidad de finalizar la cola para señalar a los consumidores
- Alto rendimiento sin bloqueos
Ejemplo de uso:
using System.Threading.Channels;
var channel = Channel.CreateBounded<string>(100);
// Productorvar producer = Task.Run(async () =>{ for (int i = 0; i < 10; i++) { await channel.Writer.WriteAsync($"Task {i}"); await Task.Delay(100); } channel.Writer.Complete();});
// Consumidorvar consumer = Task.Run(async () =>{ await foreach (var item in channel.Reader.ReadAllAsync()) { Console.WriteLine($"Processing: {item}"); await Task.Delay(200); }});
await Task.WhenAll(producer, consumer);Cuándo usarlo: para colas internas en un solo proceso, cuando no se requiere persistencia o procesamiento distribuido.
2. Hangfire — biblioteca avanzada de tareas en segundo plano
Hangfire es una de las bibliotecas más populares para gestionar tareas en segundo plano en .NET. Soporta colas, planificación, reintentos y monitoreo.
Características clave:
- Persistencia (SQL Server, Redis, PostgreSQL, etc.)
- Interfaz web para monitoreo
- Soporte para tareas diferidas y recurrentes
- Reintentos automáticos en caso de fallos
Ejemplo de configuración y uso:
// Instalación: Install-Package Hangfire// En Startup.cspublic void ConfigureServices(IServiceCollection services){ services.AddHangfire(config => config.UseSqlServerStorage(connectionString)); services.AddHangfireServer();}
// Usopublic class EmailService{ public void SendWelcomeEmail(int userId) { // Lógica de envío de email Console.WriteLine($"Sending email to user {userId}"); }}
// Poner tarea en colaBackgroundJob.Enqueue<EmailService>(x => x.SendWelcomeEmail(42));
// Tarea diferidaBackgroundJob.Schedule<EmailService>( x => x.SendWelcomeEmail(43), TimeSpan.FromMinutes(5));Cuándo usarlo: para aplicaciones web donde se requiere guardar tareas entre reinicios, monitoreo y planificación flexible.
3. RabbitMQ.Client — cola de mensajes distribuida
Para sistemas distribuidos donde varios servicios necesitan intercambiar tareas, se utiliza RabbitMQ. La biblioteca RabbitMQ.Client proporciona acceso completo al protocolo AMQP.
Ejemplo básico productor-consumidor:
using RabbitMQ.Client;using System.Text;
// Productorvar factory = new ConnectionFactory() { HostName = "localhost" };using var connection = factory.CreateConnection();using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "task_queue", durable: true, exclusive También en la biblioteca
Retrofit para Kotlin: guía completa con ejemplos
Envío de SMS en TypeScript: API de la biblioteca sms-client-ts
Knex.js para JavaScript (Node.js): guía completa con ejemplos