Agendador de tarefas em C# (.NET): do timer simples ao industrial Quartz.NET
O Agendador de Tarefas (Task Scheduler) é uma parte essencial de qualquer aplicação séria. Seja para limpeza periódica de cache, envio de newsletters por email ou sincronização de dados com uma API externa — não é possível prescindir de um mecanismo confiável para executar operações em segundo plano. No ecossistema .NET, o desenvolvedor tem várias abordagens disponíveis: desde o embutido System.Threading.Timer até o poderoso e flexível framework Quartz.NET. Neste artigo, analisaremos ambas as opções, mostraremos exemplos de código e ajudaremos você a escolher a ferramenta adequada para o seu projeto.
1. System.Threading.Timer embutido
A maneira mais simples e leve de executar uma tarefa agendada é usar o System.Threading.Timer. Ele não requer a instalação de pacotes de terceiros e é ideal para cenários simples: executar um método em intervalos fixos ou com um atraso único.
Exemplo: executar uma tarefa a cada 5 segundos
using System;using System.Threading;
class Program{ static void Main() { // Criamos um timer que executa o callback a cada 5 segundos Timer timer = new Timer(DoWork, null, TimeSpan.Zero, TimeSpan.FromSeconds(5)); Console.WriteLine("Timer iniciado. Pressione Enter para sair."); Console.ReadLine(); timer.Dispose(); }
static void DoWork(object state) { Console.WriteLine($"[{DateTime.Now:HH:mm:ss}] Executando tarefa em segundo plano..."); }}Vantagens:
- Embutido no .NET, sem necessidade de bibliotecas adicionais.
- Consumo mínimo de recursos.
- Simplicidade de uso.
Desvantagens:
- Sem suporte nativo para expressões CRON.
- Difícil gerenciar várias tarefas com agendamentos diferentes.
- Sem mecanismos de persistência (as tarefas são perdidas ao reiniciar).
- O callback é executado em uma thread do pool, podendo haver problemas de sincronização.
Para projetos de estudo e utilitários simples, o System.Threading.Timer é uma excelente escolha. No entanto, para aplicações de produção com dezenas de tarefas, vale a pena considerar soluções mais avançadas.
2. Quartz.NET — agendador de tarefas industrial
Quartz.NET é um framework poderoso, flexível e maduro para agendamento de tarefas em .NET. Ele é inspirado no popular equivalente Java Quartz e suporta:
- Expressões CRON para agendamento flexível (a cada duas horas, em dias úteis às 9:00, etc.).
- Persistência de tarefas (armazenamento em banco de dados).
- Clusterização (vários servidores podem executar tarefas).
- Tratamento de tarefas perdidas (misfire handling).
- Tarefas filhas e triggers.
Instalação do Quartz.NET
Instale o pacote via NuGet:
dotnet add package QuartzExemplo: tarefa simples com agendamento CRON
using System;using System.Threading.Tasks;using Quartz;using Quartz.Impl;
class Program{ static async Task Main() { // Criamos o agendador StdSchedulerFactory factory = new StdSchedulerFactory(); IScheduler scheduler = await factory.GetScheduler(); await scheduler.Start();
// Definimos a tarefa (Job) IJobDetail job = JobBuilder.Create<HelloJob>() .WithIdentity("helloJob", "group1") .Build();
// Criamos o trigger: todos os dias às 10:30 da manhã ITrigger trigger = TriggerBuilder.Create() .WithIdentity("trigger1", "group1") .WithCronSchedule("0 30 10 ? * * *") // CRON: segundo, minuto, hora, dia, mês, dia da semana .Build();
// Registramos a tarefa com o trigger await scheduler.ScheduleJob(job, trigger);
Console