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
Também na biblioteca
Trabalhando com YAML em PHP: bibliotecas, parsing e criação de arquivos
WebSocket em Rust: bibliotecas tokio-tungstenite e tungstenite
gRPC para TypeScript: bibliotecas, configuração e exemplos de código
Serialização de objetos em Go (Golang): Guia completo
Envio de SMS em PHP: bibliotecas de API do sms.ru e outros serviços
Recommendations