Geral

Usando Timer em uma aplicação Windows Services.

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


Bookmark and Share

9 Comments

  1. 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!

  2. 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)
    {
    }
    }
    }

Deixe uma resposta