Filas de Tarefas para C# (.NET): De Primitivos Básicos a Soluções Industriais
A organização do processamento assíncrono de tarefas é uma das principais tarefas ao desenvolver aplicações de alta carga em C#. No ecossistema .NET, existem várias abordagens: desde primitivos de sincronização embutidos até poderosas bibliotecas externas. Neste artigo, veremos as principais ferramentas para trabalhar com filas de tarefas, seus pontos fortes e exemplos de uso.
1. System.Threading.Channels — Ferramenta Embutida do .NET
A partir do .NET Core 2.1, a biblioteca padrão incluiu a classe System.Threading.Channels.Channel<T>. Esta é uma fila thread-safe, otimizada para cenários de produtor-consumidor.
Principais Recursos:
- Leitura e escrita assíncronas (
WriteAsync,ReadAsync) - Suporte para filas limitadas e ilimitadas
- Capacidade de finalizar a fila para sinalizar os consumidores
- Alto desempenho sem bloqueios
Exemplo de Uso:
using System.Threading.Channels;
var channel = Channel.CreateBounded<string>(100);
// Produtorvar 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);Quando usar: para filas internas em um único processo, quando não é necessária persistência ou processamento distribuído.
2. Hangfire — Biblioteca Avançada de Tarefas em Segundo Plano
Hangfire é uma das bibliotecas mais populares para gerenciar tarefas em segundo plano no .NET. Ela suporta filas, agendamento, novas tentativas e monitoramento.
Principais Características:
- Persistência (SQL Server, Redis, PostgreSQL, etc.)
- Interface web para monitoramento
- Suporte para tarefas atrasadas e recorrentes
- Novas tentativas automáticas em caso de falhas
Exemplo de Configuração e Uso:
// Instalação: Install-Package Hangfire// Em 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 envio de email Console.WriteLine($"Sending email to user {userId}"); }}
// Colocar tarefa na filaBackgroundJob.Enqueue<EmailService>(x => x.SendWelcomeEmail(42));
// Tarefa atrasadaBackgroundJob.Schedule<EmailService>( x => x.SendWelcomeEmail(43), TimeSpan.FromMinutes(5));Quando usar: para aplicações web onde é necessário salvar tarefas entre reinicializações, monitoramento e agendamento flexível.
3. RabbitMQ.Client — Fila de Mensagens Distribuída
Para sistemas distribuídos, onde vários serviços precisam trocar tarefas, utiliza-se RabbitMQ. A biblioteca RabbitMQ.Client fornece acesso completo ao protocolo AMQP.
Exemplo Básico de Produtor-Consumidor:
using RabbitMQ.Client;using System.Text;
// Produtorvar factory = new ConnectionFactory() { HostName = "localhost" };using var connection = factory.CreateConnection();using var channel = connection.CreateModel();
channel.QueueDeclare(queue: "task_queue", durable: true, exclusive Também na biblioteca
Processamento de Imagens em Kotlin: redimensionar e cortar com a biblioteca ImageMagick
GameplayKit para Swift: guia completo com exemplos práticos
ORM para Kotlin: comparação e exemplos (Exposed, Ktorm, Hibernate)