Agendador de tarefas em C# (.NET): Quartz.NET e System.Threading.Timer

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

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 Quartz


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

Recommendations