Filas de Tarefas em C# (.NET): Visão Geral de Bibliotecas e Implementações

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): 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

Recommendations