Pessoal,
Hoje me perguntaram sobre a utilização do objeto Timer em uma aplicação Windows Services, questionando que ao adicionar o objeto direto da Toolbox ele não estava sendo executado no seu respectivo intervalo.
Bom Primeiro vamos esclarecer duas coisas para quem ainda não conhece. O que é Windows Services e o Objeto Timer?
- Windows Services: Aplicação windows que fica sendo executada em background no S.O.
- Objeto Timer: Objeto disponivel na plataforma .NET para executarmos funcionalidades em um determinado espaço de tempo.
Agora como faço para usar o Timer em um Windows Services? eu recomendo que seja feito de maneira dinâmica ao invés incluir o objeto via toolbox… Apenas por gosto
Para que o timer funcione de acordo com o proposto temos que adicionar ao nosso objeto Timer, um EventHandler(ElapsedEventHandler) ele executará as funcionalidades codificadas respeitando o intervalo informado ao objeto. Vamos ao exemplo:
Para iniciar, no seu projeto Windows Services, importe a referência das classe Timers:
using System.Timers;
Agora em sua classe Inicialize o objeto Timer, isso se você estiver fazendo de forma dinâmica,se você escolheu adicionar o objeto direto do toolbox pule este passo.
namespace WindowsService3 { public partial class TimeSrv : ServiceBase { //Inicializando o objeto timer Timer timer = new Timer();
Como estamos falando de Windows Service, agora em nosso evento de inicialização do serviço (OnStart), o qual é executado sempre que o serviço é iniciado vamos habilitar o timer e definir um timer para sua execução.
protected override void OnStart(string[] args) { //Escreve no Visualizador de Evento do Windows EventLog.WriteEntry(“Serviço Inicializado.”, EventLogEntryType.Information); //1: Adicionando o evento Elapsed ao objeto Timer timer.Elapsed += new ElapsedEventHandler(OnElapsedTime); //2: Marcando o como intervalo 1 minuto (= 60,000 milliseconds) timer.Interval = 60000; //3: Habilitando o objeto timer para execução. timer.Enabled = true; }
Sendo que definimos um evento Elapsed ao objeto timer chamado OnElapsedTime, temos que ter o método criado, nele teremos o código que será executado assim que o timer for habilitado, claro tudo isso dentro do intervalo definido acima. Em nosso exemplo eu apenas escrevo a data no Visualizador de Eventos do Windows, mas lembrando que o código ali executado fica a critério do desenvolvedor.
private void OnElapsedTime(object source, ElapsedEventArgs e) { EventLog.WriteEntry(“Executando serviço: ” + DateTime.Now.ToShortTimeString(),EventLogEntryType.Information); }
Agora para fecharmos mais esta dica basta usar o evento OnStop do seu serviço, evento que é executado quando seu Windows Services é parado, para desabilitar o timer.
protected override void OnStop() { timer.Enabled = false; EventLog.WriteEntry(“Serviço Parado.”,EventLogEntryType.Information); }
Bom espero ter resolvido a dúvida do pessoal da comunidade que estava me perguntando e claro passado mais uma dica a todos.
[]’s
Cara muito obrigado!! vc sanou um grande problema meu, a
alguns dias eu venho tentando fazer exatamente isso, e realmente
nao estava funcionando com o componente timer arrastado da tool
box! obrigado! grande abraço!
Valeu pela dia, depois de muita porcaria uma dica realmente funcional.
Muito Bom o Post… me ajudou bastante…
Parabéns, parece um negócio simples … mas me ajudou pacas … vlw
Me ajudou muito. Obrigado!
Bom dia,
Eu posso usar um método sincronizado em conjunto com um Timer ?
Muito obrigado, sua explicação foi muito importante pra mim! Vlw mesmo!
Cara, vlw, resolveu meu problema!!!
Foi muito legal a dia, mas no meu não funcionou…
Olhe o código:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Diagnostics;
using System.Linq;
using System.ServiceProcess;
using System.Text;
using System.Timers;
namespace SmartPremiumService
{
public partial class ServiceTokenUnit : ServiceBase
{
public ServiceTokenUnit()
{
InitializeComponent();
}
Timer t = new Timer();
public void ondebug()
{
OnStart(null);
System.Threading.Thread.Sleep(10000);
OnPause();
System.Threading.Thread.Sleep(10000);
}
public void starttime()
{
t.Elapsed += new ElapsedEventHandler(OnElapsedTime);
t.Interval = 5000;
t.Enabled = true;
}
public void stoptime()
{
t.Enabled = false;
}
private void OnElapsedTime(object source, ElapsedEventArgs e)
{
eventLogTokenUnitFour.WriteEntry(“Evento Time “+DateTime.Now.ToString(), EventLogEntryType.Information, -1);
}
protected override void OnStart(string[] args)
{
eventLogTokenUnitFour.WriteEntry(“Serviço iniciado”, EventLogEntryType.Information, 1);
starttime();
notifyIconServiceTokenUnitFour.BalloonTipText = “Gerador de Token Iniciado”;
notifyIconServiceTokenUnitFour.ShowBalloonTip(10000);
}
protected override void OnStop()
{
eventLogTokenUnitFour.WriteEntry(“Serviço parado”, EventLogEntryType.Warning, 2);
stoptime();
notifyIconServiceTokenUnitFour.BalloonTipText = “Gerador de Token Pausado”;
notifyIconServiceTokenUnitFour.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Warning;
notifyIconServiceTokenUnitFour.ShowBalloonTip(10000);
}
protected override void OnContinue()
{
eventLogTokenUnitFour.WriteEntry(“Serviço reiniciado”, EventLogEntryType.Information, 3);
starttime();
notifyIconServiceTokenUnitFour.BalloonTipText = “Gerador de Token reiniciado”;
notifyIconServiceTokenUnitFour.ShowBalloonTip(10000);
}
protected override void OnPause()
{
eventLogTokenUnitFour.WriteEntry(“Serviço pausado”, EventLogEntryType.Warning, 4);
stoptime();
notifyIconServiceTokenUnitFour.BalloonTipText = “Gerador de Token Parado”;
notifyIconServiceTokenUnitFour.BalloonTipIcon = System.Windows.Forms.ToolTipIcon.Warning;
notifyIconServiceTokenUnitFour.ShowBalloonTip(10000);
}
private void timerGerarToken_Tick(object sender, EventArgs e)
{
}
}
}