Usuário com melhor resposta
Windows Service - Executando 2 vezes

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
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.- Marcado como Resposta PRicardo Ferreira sexta-feira, 17 de fevereiro de 2012 13:03
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.- Marcado como Resposta PRicardo 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.