Filas de Tarefas em C# (.NET): System.Threading.Channels, Hangfire e RabbitMQ

Treinador Online de Python para Iniciantes

Aprenda Python facilmente sem sobrecarga teórica. Resolva tarefas práticas com verificação automática e escreva código diretamente no navegador.

Start Course

Filas de Tarefas para C# (.NET): do simples ao complexo



O desenvolvimento moderno em C# (.NET) raramente dispensa tarefas em segundo plano, processamento adiado e operações assíncronas. Filas de Tarefas (Job Queues / Message Queues) são um padrão chave que permite desafogar o fluxo principal da aplicação, garantir a entrega de mensagens e escalar o processamento. Neste artigo, veremos três abordagens populares para implementar filas no .NET: o nativo System.Threading.Channels, o poderoso agendador Hangfire e o broker de mensagens industrial RabbitMQ com cliente para .NET.



1. System.Threading.Channels — fila nativa no .NET



System.Threading.Channels é uma fila leve e thread-safe, disponível diretamente no .NET (a partir do .NET Core 2.1). É ideal para cenários de "produtor-consumidor" dentro de um único processo.



Principais recursos:

  • Leitura e escrita assíncronas (await writer.WriteAsync(), await reader.ReadAsync()).
  • Canais limitados e ilimitados (Bounded / Unbounded).
  • Suporte a cancelamento via CancellationToken.
  • Leitura em lote (ReadAllAsync).


Exemplo: fila de tarefas simples

using System.Threading.Channels;

// Criando um canal com buffer de 100 elementosvar channel = Channel.CreateBounded<string>(100);

// Produtor: adicionando tarefasvar producer = Task.Run(async () =>{ for (int i = 0; i < 10; i++) { await channel.Writer.WriteAsync($"Tarefa {i}"); await Task.Delay(100); } channel.Writer.Complete(); // sinal de conclusão});

// Consumidor: processando tarefasvar consumer = Task.Run(async () =>{ await foreach (var item in channel.Reader.ReadAllAsync()) { Console.WriteLine($"Processado: {item}"); }});

await Task.WhenAll(producer, consumer);


Prós: dependência zero, alta performance, ideal para filas in-memory em uma única aplicação.
Contras: não adequado para sistemas distribuídos — dados são perdidos ao reiniciar.



2. Hangfire — agendador avançado de tarefas em segundo plano



Hangfire é uma biblioteca popular para .NET que não apenas implementa uma fila, mas também fornece um painel web, persistência (SQL Server, Redis, PostgreSQL), novas tentativas e agendamentos CRON.



Principais recursos:

  • Fire-and-forget (execução única).
  • Tarefas adiadas (Delayed).
  • Tarefas recorrentes (Recurring) — substituto do Windows Task Scheduler.
  • Retry automático com política configurável.
  • Monitoramento integrado (painel).


Exemplo: configuração básica do Hangfire

// Instalação: Install-Package Hangfireusing Hangfire;using Hangfire.SqlServer;

// Configuração em 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

// Adicionando tarefasBackgroundJob.Enqueue(() => Console.WriteLine("Fire-and-forget!"));BackgroundJob.Schedule(() => Console.WriteLine("Daqui a 5 minutos"), TimeSpan.FromMinutes(5));RecurringJob.AddOrUpdate("my-job", () => Console.WriteLine("A cada minuto"), Cron.Minutely);

app.Run();


Prós: rica funcionalidade, preservação de estado entre reinicializações, UI pronta.
Contras: requer banco de dados, não é adequado para sistemas distribuídos de alta carga (voltado para monólitos).



3. RabbitMQ + .NET — fila de mensagens distribuída



RabbitMQ

Recommendations