none
Windows Service - Executando 2 vezes RRS feed

  • Pergunta

  • Salve!

    Windows Service desenvolvido em VB2005.

    Criei um Windows Service para envio automático de emails nos dias 1 e 16 de cada mês, somente uma vez em cada um destes dias, no horário entre 6 e 7 horas da manhã.

    Para tanto inclui um objeto Timers.Timer e no evento OnStart do serviço coloquei o seguinte código:

    Protected Overrides Sub OnStart(ByVal args() As String)
        ' Add code here to start your service. This method should set things
        ' in motion so your service can do its work.
        Try
            If args.Length = 0 Then
                EventLog.WriteEntry("WS-EnviaEmailsDeAlertaDePrazo foi iniciado manual ou automaticamente pelo SO.", System.Diagnostics.EventLogEntryType.Information)
            Else
                EventLog.WriteEntry("WS-EnviaEmailsDeAlertaDePrazo foi iniciado automaticamente pela aplicação web SisGesPend.", System.Diagnostics.EventLogEntryType.Information)
            End If
            AddHandler myTimer.Elapsed, New System.Timers.ElapsedEventHandler(AddressOf myTimer_Elapsed)
            With myTimer
                .AutoReset = True
                .Interval = 3600000
                .Enabled = True
            End With
            myTimer.Start()
        Catch ex As Exception
            EventLog.WriteEntry("WS-EnviaEmailsDeAlertaDePrazo - ocorreu um erro no seu processamento. " + ex.Message.ToString, System.Diagnostics.EventLogEntryType.Information)
            EnviaMensagemErro(ex.Message.ToString(), ex.StackTrace.ToString())
            Me.Stop()
        End Try
    End Sub
    

    Configurei o Timer para um intervalo de 1 hora (3600000 ms).

    No evento TimerElapsed do objeto Timer coloquei o seguinte código:

    Private Sub myTimer_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles myTimer.Elapsed
    
        '// Verifica a data e a hora para executar o possível envio de emails 
        '// só uma vez ao dia (entre 06 e 07 hs) e só nos dias 1 e 16 de cada mês
        If DateTime.Now.Day = 1 Or DateTime.Now.Day = 16 Then
            EventLog.WriteEntry("WS-EnviaEmailAlertaDePrazo entro no If do dia.", System.Diagnostics.EventLogEntryType.Information)
            If DateTime.Now.Hour = 6 AndAlso Not blnJaEnviou Then
                intEmails = 0
                EnviaEmails()
                EventLog.WriteEntry("WS-EnviaEmailAlertaDePrazo enviou " + intEmails.ToString + " emails.", System.Diagnostics.EventLogEntryType.Information)
                Exit Sub
                blnJaEnviou = True
            End If
        Else
            blnJaEnviou = False
        End If
    End Sub
    

    O que acontece é que se pego o código acima e coloco no evento Click de um botão tudo acontece normalmente e os emails são enviados. Já no Windows Service, o método EnviaEmails está sendo executado duas vezes!

    O que pode estar causando isso?

    Grato pela atenção de todos.

    Paulo Ricardo Ferreira

    quinta-feira, 16 de fevereiro de 2012 17:55

Respostas

  • Depois de enviar os emails faça o serviço "dormir" por 3 horas. Isto vai garantir que a próxima verificação esteja fora do invtervalo.

    Thread.Sleep() 'Setar o tempo de "sono"

    Eu tenho um serviço que faz a mesma coisa todos os dias úteis (envio de email) e resolvi desta forma.


    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    quinta-feira, 16 de fevereiro de 2012 20:02

Todas as Respostas

  • Depois de enviar os emails faça o serviço "dormir" por 3 horas. Isto vai garantir que a próxima verificação esteja fora do invtervalo.

    Thread.Sleep() 'Setar o tempo de "sono"

    Eu tenho um serviço que faz a mesma coisa todos os dias úteis (envio de email) e resolvi desta forma.


    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    quinta-feira, 16 de fevereiro de 2012 20:02
  • Caro Paulo César,

    Vou testar a sua sugestão, só que só poderei ver o resultado ao voltar das minhas férias que começam hoje!

    Grato pela sua atenção.
    Paulo Ricardo Ferreira
    sexta-feira, 17 de fevereiro de 2012 13:03
  • Funciona, te garanto!

    Paulo César Viana
    .NET Developer
    MCC - Microsoft Community Contributor
    MCP - Microsoft Certified Professional
    MCTS - Microsoft Certified Technology Especialist
    --
    Marque as respostas e contribua para uma melhora no fórum.

    sexta-feira, 17 de fevereiro de 2012 13:10