Windows Service diaparado minuto a minuto
04/09/2012
0
Pjava
Posts
04/09/2012
Pjava
using System.Threading;
using timer = System.Timers;
namespace GrupoLTM.Servico
{
public partial class Service1 : ServiceBase
{
string Erro = "";
Thread t = null;
timer.Timer tm = new timer.Timer();
List<Domain.Entity.AgendamentoRotina> agendamentos = new List<Entity.AgendamentoRotina>();
public Service1()
{
InitializeComponent();
}
protected override void OnStart(string[] args)
{
tm.Interval = 60000;
tm.Elapsed += new timer.ElapsedEventHandler(OnElapsedTime);
tm.Enabled = true;
t = new Thread(Executar);
t.Start();
Thread.Sleep(60000);
}
protected override void OnStop()
{
try
{
t.Abort();
}
catch (ThreadAbortException tae)
{
Erro = tae.Message;
GravaLogErro(Erro);
}
}
private void Executar()
{
var rotinas = Repository.Rotina.RetornarTodos();
var _log = Repository.LogAgendamentoRotina.RetornarTodos();
Entity.LogAgendamentoRotina log = null;
foreach (var rotina in rotinas)
{
agendamentos.AddRange(rotina.Agendamentos.FindAll(c => c.DataExecucaoInicial >= DateTime.Now.AddDays(-2) && c.DataExecucaoInicial <= DateTime.Now.AddDays(1)));
}
foreach (var agendamento in agendamentos)
{
if ((agendamento.FrequenciaExecucao.DescricaoFrequencia == "Unica" || agendamento.FrequenciaExecucao.DescricaoFrequencia == "Diario"
|| agendamento.FrequenciaExecucao.DescricaoFrequencia == "Semanal" || agendamento.FrequenciaExecucao.DescricaoFrequencia == "Mensal")
&& agendamento.DataExecucaoInicial > DateTime.Now.AddDays(-2) && agendamento.DataExecucaoInicial < DateTime.Now.AddMinutes(1)
&& agendamento.DataExecucaoFinal <= DateTime.Now.AddDays(5) && agendamento.Ativo == true)
{
try
{
agendamento.Rotina.Executar();
GravaLog();
}
catch (Exception e)
{
Erro = e.Message;
GravaLogErro(Erro);
}
} //if
} //foreach
}
07/09/2012
Pjava
protected override void OnStart(string[] args)
{
while (true)
{
t = new Thread(Executar);
t.Start();
Thread.Sleep(60000);
}
}
Isso está fazendo com que o serviço envie 2,3 ou 4 emails num intervalo de um minuto,quando deveria apenas enviar um e como fazer para executar uma tarefa, somente quando a outra terminar por completo.
07/09/2012
Pjava
10/09/2012
Pjava
OnStart
verificaExecucaoRotina = VerificaExecucaoRotina();
if (!verificaExecucaoRotina)
{
ThreadStart st = new ThreadStart(Executar);
t = new Thread(st);
serviceStarted = true;
t.Start();
}
else
{
Thread.Sleep(60000);
verificaExecucaoRotina = false;
}
Meu método Executar()
private void Executar()
{
while (serviceStarted)
{
var rotinas = Repository.Rotina.RetornarTodos();
var _log = Repository.LogAgendamentoRotina.RetornarTodos();
Entity.LogAgendamentoRotina log = null;
foreach (var rotina in rotinas)
{
agendamentos.AddRange(rotina.Agendamentos.FindAll(c => c.DataExecucaoInicial >= DateTime.Now.AddDays(-9) && c.DataExecucaoInicial <= DateTime.Now.AddDays(1)));
}
foreach (var agendamento in agendamentos)
{
if ((agendamento.FrequenciaExecucao.DescricaoFrequencia == "Unica" || agendamento.FrequenciaExecucao.DescricaoFrequencia == "Diario"
|| agendamento.FrequenciaExecucao.DescricaoFrequencia == "Semanal" || agendamento.FrequenciaExecucao.DescricaoFrequencia == "Mensal")
&& agendamento.DataExecucaoInicial > DateTime.Now.AddDays(-9) && agendamento.DataExecucaoInicial < DateTime.Now.AddMinutes(1)
&& agendamento.DataExecucaoFinal <= DateTime.Now.AddDays(5) && agendamento.Ativo == true)
{
try
{
agendamento.Rotina.Executar();
GravaLog();
}
catch (Exception e)
{
Erro = e.Message;
GravaLogErro(Erro);
}
} //if
} //foreach
if (serviceStarted)
{
Thread.Sleep(new TimeSpan(0, 1, 0));
}
Clique aqui para fazer login e interagir na Comunidade :)