Entendendo Temporizadores em C#: PeriodicTimer, System.Timers.Timer e System.Threading.Timer | Csharp
- Entendendo Temporizadores em C#:
PeriodicTimer,System.Timers.TimereSystem.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
| Timer | Modelo | Execução | Re-entrância | Fácil com async | |
|---|---|---|---|---|---|
| System.Threading.Timer | Callback | ThreadPool | ✔️ Sim | ❌ Não nativo | |
| System.Timers.Timer | Evento | ThreadPool | ✔️ Sim | ❌ Não nativo | |
| PeriodicTimer | Async loop | Aguardado | ❌ 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])