C# Windows Service a Commencé et s'est ensuite Arrêté Automatiquement

Je suis la création de ce service windows en suivant les instructions à MSDN Procédure pas à pas: Création d'un Service Windows et après une installation réussie, je vais à des Services.msc pour Démarrer le service Windows et avant la fin de son départ, je reçois le message suivant:

La EIWindowsService service sur l'Ordinateur Local a démarré puis s'est arrêté. Certains services s'arrêtent automatiquement si elles ne sont pas en cours d'utilisation par d'autres services ou programmes.

Je sais que le Service Windows démarre ok car il y a une entrée dans le fichier journal indiquant que le service a commencé. J'ai fait quelques recherches avant de poster ici et la réponse de Certains Services S'Arrêtent Automatiquement états que le problème pourrait être que la méthode OnStart est de lancer une erreur, ou que le Démarrage n'est pas le coup d'envoi d'un thread. J'ai donc modifié mon code pour que la seule chose dans le Démarrage est le départ de deux minuteries et de l'entrée de journal, par conséquent, ne nécessitant pas de manipulation d'exception. J'ai également ajouté un fil à passer à une autre méthode.

J'ai essayé le service windows à nouveau et je sais qu'elle a "déménagé" à la nouvelle méthode que le thread a souligné parce que j'ai eu une entrée de journal qu'il jeta aFormatException d'erreur en raison de certaines de conversion, j'étais en train de faire. J'ai commenté la conversion et le service windows encore, tout a commencé à démarrer puis s'est arrêté automatiquement.

D'autres recherches m'a indiqué que je pourrais avoir besoin d'une boucle pour maintenir le traitement à l'intérieur de la méthode, alors j'ai pris des informations de C - Windows Service le Service sur et mettre en place une boucle while infinie. J'ai aussi trouvé qu'il pourrait être la Collecte des Ordures se passe et établi un KeepAlive déclaration pour les compteurs, comme suggéré dans la section Exemples de MSDN Classe Timer. Toujours les mêmes questions.

À ce point, j'ai l'impression de exhaused toutes les recherches que je peux faire de sorte qu'il serait approprié de poster ma question ici. Tout mon code est ci-dessous et je note qu'avant de j'ai effectué aucun changement, j'ai désinstallé le Service Windows, retiré du Projet d'Installation, et a supprimé les installateurs dans le code C#. J'ai ensuite fait des changements et a commencé avec les instructions de la section de la Soluce de départ au point où il indique comment configurer les installateurs. Je l'ai fait à chaque fois car j'ai trouvé que si j'ai fait des modifications et n'a pas désinstaller le Service de Windows, supprimez le Projet de Configuration et supprimer les installateurs, puis mes modifications ne prendrait pas effet sur le actuellement installé windows service.

Toute l'aide que vous pouvez donner à qui serait le plus apprécié. Je vais être ici pour une autre 15min puis je vais vérifier ça demain.

SERVICE1.cs

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 EIWindowsService
{
public partial class Service1 : ServiceBase
{
Logs.ErrorLog logFile = new Logs.ErrorLog();
private System.Threading.Thread onStartThread;
public Service1()
{
InitializeComponent();            
}
protected override void OnStart(string[] args)
{
try
{
iTimer.Start();
iTimer.Elapsed += new ElapsedEventHandler(iTimer_Elapsed);
pTimer.Start();
pTimer.Elapsed += new ElapsedEventHandler(pTimer_Elapsed);                
onStartThread = new System.Threading.Thread(TimerValue);
onStartThread.Start();
logFile.SendToLog("EIWindows Service started on " + GetDate());
}
catch (ArgumentOutOfRangeException ex)
{
logFile.SendToLog("ArgumentOutOfRangeException", "EIWindowsService\\Service1.cs", "OnStart()", ex);
} //end of ArgumentOutOfRangeException CATCH statement
}
protected override void OnStop()
{
iTimer.Stop();
pTimer.Stop();
logFile.SendToLog("EIWindowsService\\Service1.cs", "OnStop()", "EIWindows Service stopped on " + GetDate());
}
private void TimerValue()
{
try
{
/*commented out because it was throwing an exception error*/
//double iTimerValue = Convert.ToDouble(iTimer.ToString());
//double pTimerValue = Convert.ToDouble(pTimer.ToString());
while (1 > 0)
{
//if (iTimerValue % 1800000 == 0)  //if the timer hits the 30min mark
//{
//   logFile.SendToLog("Current iTimer Value = " + iTimerValue.ToString());
//}
//if (pTimerValue % 1800000 == 0)  //if the timer hits the 30min mark
//{
//   logFile.SendToLog("Current pTimer Value = " + pTimerValue.ToString());
//}
GC.KeepAlive(iTimer);
GC.KeepAlive(pTimer);
}
//TimerValue();
}
catch (OverflowException ex)
{
logFile.SendToLog("OverflowException", "EIWindowsService\\Service1.cs", "TimerValue()", ex);
} //end of OverflowException CATCH statement
catch (ArgumentException ex)
{
logFile.SendToLog("ArgumentException", "EIWindowsService\\Service1.cs", "TimerValue()", ex);
} //end of ArgumentException CATCH statement
catch (FormatException ex)
{
logFile.SendToLog("FormatException", "EIWindowsService\\Service1.cs", "TimerValue()", ex);
} //end of FormatException CATCH statement
}
private string GetDate()
{
string current = "No Date Recorded";
try
{
current = DateTime.Now.ToString("F");
}
catch (FormatException ex)
{
logFile.SendToLog("FormatException", "EIWindowsService\\Service1.cs", "GetDate()", ex);
} //end of FormatException CATCH statement
return current;
} //end of method GetDate
private void iTimer_Elapsed(object source, ElapsedEventArgs e)
{
try
{
iTimer.Stop();
ImportI();
iTimer.Start();
}
catch (ArgumentOutOfRangeException ex)
{
logFile.SendToLog("ArgumentOutOfRangeException", "EIWindowsService\\Service1.cs", "iTimer_Elapsed()", ex);
} //end of ArgumentOutOfRangeException CATCH statement
} //end of method iTimer_Elapsed
private void pTimer_Elapsed(object source, ElapsedEventArgs e)
{
try
{
pTimer.Stop();
ImportP();
pTimer.Start();
}
catch (ArgumentOutOfRangeException ex)
{
logFile.SendToLog("ArgumentOutOfRangeException", "EIWindowsService\\Service1.cs", "pTimer_Elapsed()", ex);
} //end of ArgumentOutOfRangeException CATCH statement
} //end of method pTimer_Elapsed
private void ImportI()
{
//does some action but commented out because it never gets here and is not relavant to this question.
} //end of method ImportI
private void ImportP()
{
//does some action but commented out because it never gets here and is not relavant to this question.
} //end of method ImportP
}
}

SERVICE1.Le CONCEPTEUR.CS (le relavant des trucs)

private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
this.pTimer = new System.Timers.Timer(10800000);  //3hrs
this.iTimer = new System.Timers.Timer(3600000);  //1hr
//
//pTimer
//
this.pTimer.Enabled = true;
//
//iTimer
//
this.iTimer.Enabled = true;
//
//Service1
//
this.ServiceName = "EIWindowsService";
}
#endregion
private System.Timers.Timer pTimer;
private System.Timers.Timer iTimer;

OriginalL'auteur Invaderleige | 2011-09-10