Erro 1053 o serviço não respondeu à solicitação de início ou controle
Eu escrevi um serviço do Windows em C # que basicamente verifica meu banco de dados a cada minuto para pedidos, gera um PDF a partir desses pedidos e envia um e-mail para ele.
A lógica funciona perfeitamente nos meus testes etc.
Quando eu crio o serviço e o instalo usando o projeto de instalação, quando vou iniciar o serviço nos serviços mmc, fico:
erro 1053 o serviço não respondeu à solicitação de início ou controle em tempo hábil
Meu método OnStart se parece com isso:
protected override void OnStart(string[] args)
{
//writeToWindowsEventLog("Service started", EventLogEntryType.Information);
timer.Enabled = true;
}
Basicamente, apenas ativa o temporizador ... então não há chamada de processo intensivo lá.
Onde eu estou errando?
Eu tentei configurar a conta de inicialização para o sistema local, serviço de rede etc ... nada funciona!
Editar:
Aqui está o meu código: (processPurchaseOrders é o método onde o banco de dados é consultado e os PDFs são gerados, etc ...)
public partial class PurchaseOrderDispatcher : ServiceBase
{
//this is the main timer of the service
private System.Timers.Timer timer;
public PurchaseOrderDispatcher()
{
InitializeComponent();
}
// The main entry point for the process
static void Main()
{
#if (!DEBUG)
ServiceBase[] ServicesToRun;
ServicesToRun = new ServiceBase[] { new PurchaseOrderDispatcher() };
ServiceBase.Run(ServicesToRun);
#else //debug code
PurchaseOrderDispatcher service = new PurchaseOrderDispatcher();
service.processPurchaseOrders();
#endif
}
private void InitializeComponent()
{
this.CanPauseAndContinue = true;
this.ServiceName = "Crocus_PurchaseOrderGenerator";
}
private void InitTimer()
{
timer = new System.Timers.Timer();
//wire up the timer event
timer.Elapsed += new ElapsedEventHandler(timer_Elapsed);
//set timer interval
var timeInSeconds = Convert.ToInt32(ConfigurationManager.AppSettings["TimerIntervalInSeconds"]);
timer.Interval = (timeInSeconds * 1000); // timer.Interval is in milliseconds, so times above by 1000
timer.Enabled = true;
}
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
components.Dispose();
base.Dispose(disposing);
}
protected override void OnStart(string[] args)
{
//instantiate timer
Thread t = new Thread(new ThreadStart(this.InitTimer));
t.Start();
}
protected override void OnStop()
{
//turn off the timer.
timer.Enabled = false;
}
protected override void OnPause()
{
timer.Enabled = false;
base.OnPause();
}
protected override void OnContinue()
{
timer.Enabled = true;
base.OnContinue();
}
protected void timer_Elapsed(object sender, ElapsedEventArgs e)
{
processPurchaseOrders();
}
}