Skip to main content

Entendendo Temporizadores em C#: PeriodicTimer, System.Timers.Timer e System.Threading.Timer | Csharp

  • Entendendo Temporizadores em C#: PeriodicTimer, System.Timers.Timer e System.Threading.Timer | Csharp

Temporizadores (timers) são ferramentas fundamentais para executar tarefas repetidas ao longo do tempo — como atualizar dados periodicamente, executar verificações agendadas ou realizar ações em intervalos definidos. No C#, a plataforma .NET oferece várias opções de temporizadores, cada uma com características próprias. O artigo C# Timers Explained ajuda a esclarecer quais são essas opções e quando usá-las. ([c-sharpcorner.com][1])


🧠 Por que há tantos timers?

Ao digitar “Timer” na sua IDE (como o Visual Studio), você pode se deparar com várias classes de temporizadores. Isso acontece porque cada uma foi criada com um propósito específico — desde tarefas simples até cenários avançados de concorrência e código assíncrono. ([c-sharpcorner.com][1])


⏱️ 1. System.Threading.Timer – O básico e eficiente

O System.Threading.Timer é o temporizador mais antigo e mais simples de usar. Ele executa um delegado de callback em intervalos regulares usando uma thread do Thread Pool. ([c-sharpcorner.com][1])

Como funciona

  • Define o método que será chamado quando o tempo expirar.
  • Recebe o tempo de atraso antes da primeira execução e o intervalo para repetição.
  • Usa threads do pool — útil para tarefas em background. ([c-sharpcorner.com][1])

Pontos importantes

✔ Muito leve e eficiente. ✔ Execução em threads de trabalho. ❌ Sem recursos de evento ou sincronização automática. ❌ Pode disparar novamente antes que a execução anterior termine (re-entrância). ([c-sharpcorner.com][1])

Quando usar

  • Precisa de tarefas de alta performance.
  • Você quer o máximo controle e não precisa de eventos ou tratamento especial.

2. System.Timers.Timer – Baseado em eventos

O System.Timers.Timer foi projetado para aplicações multithreaded e adiciona recursos a partir do System.Threading.Timer. Ele funciona disparando um evento Elapsed que seu código pode escutar. ([c-sharpcorner.com][1])

Como funciona

  • Quando o tempo expira, dispara o evento Elapsed.
  • Pode ser iniciado/parado via métodos ou propriedades (Start, Stop, Enabled). ([c-sharpcorner.com][1])

Principais características

✔ Modelo baseado em eventos, mais intuitivo que callbacks. ✔ Pode adicionar múltiplos handlers ao evento. ✔ Tem propriedade AutoReset para repetir ou não. ✔ Permite sincronizar com um objeto de interface (via SynchronizingObject). ([c-sharpcorner.com][1])

Considerações

❌ Ainda pode sofrer de re-entrância (overlapping executions). ❌ Internamente usa System.Threading.Timer. ([c-sharpcorner.com][1])

Quando usar

  • Você quer um temporizador com API mais amigável.
  • Requer múltiplos ouvintes de evento.
  • Não está usando recursos avançados de async/await.

🌀 3. PeriodicTimer – O moderno (async/await)

Introduzido no .NET 6, o PeriodicTimer resolve um dos maiores problemas dos timers antigos: a sobreposição de execuções quando o trabalho leva mais tempo do que o intervalo. ([c-sharpcorner.com][1])

Como funciona

  • Você usa dentro de um loop while (await timer.WaitForNextTickAsync()).
  • Cada “tick” só ocorre depois que você termina sua tarefa anterior. ([c-sharpcorner.com][1])

Principais vantagens

✔ Perfeito para código assíncrono com async/await. ✔ Evita re-entrância — o próximo tick só vem após completar a execução atual. ✔ Suporte fácil a cancelamentos com CancellationToken. ([c-sharpcorner.com][1])

Quando usar

  • Você está usando .NET 6 ou superior.
  • Precisa de lógica async sem complicar com callbacks e eventos.
  • Quer um temporizador seguro para tarefas longas ou complexas.

📊 Comparativo rápido

TimerModeloExecuçãoRe-entrânciaFácil com async
System.Threading.TimerCallbackThreadPool✔️ Sim❌ Não nativo
System.Timers.TimerEventoThreadPool✔️ Sim❌ Não nativo
PeriodicTimerAsync loopAguardado❌ Não✔️ Sim([c-sharpcorner.com][1])

🧩 Resumo: qual escolher?

➡️ System.Threading.Timer — Para tarefas simples e de alta performance ➡️ System.Timers.Timer — Quando você quer uma API baseada em eventos ➡️ PeriodicTimer — Melhor escolha moderna com suporte a async/await


🔚 Conclusão

O .NET oferece vários tipos de temporizadores porque diferentes cenários de aplicação exigem diferentes comportamentos — desempenho, simplicidade, eventos ou integração com código async. Com a chegada do PeriodicTimer, os desenvolvedores agora têm uma solução mais segura e clara para tarefas periódicas em aplicações modernas. ([c-sharpcorner.com][1])