Service Windows C # – Démarré puis arrêté automatiquement

Je crée ce service Windows en suivant les instructions de MSDN Walkthrough: Création d’un service Windows et après une installation réussie, je vais à Services.msc pour démarrer le service Windows et avant qu’il ait fini de démarrer, je reçois le message suivant:

Le service EIWindowsService sur l’ordinateur local a démarré puis s’est arrêté. Certains services s’arrêtent automatiquement s’ils ne sont pas utilisés par d’autres services ou programmes.

Je sais que le service Windows démarre correctement car il existe une entrée dans le fichier journal indiquant que le service a démarré. J’ai fait des recherches avant de poster ici et la réponse de Some Services Stop indique automatiquement que le problème pourrait être que la méthode OnStart émet une erreur ou que l’OnStart ne lance pas un thread. J’ai donc modifié mon code pour que la seule chose à l’intérieur d’OnStart soit le démarrage de deux timers et l’entrée de journal ne nécessitant donc aucune gestion des exceptions. J’ai également ajouté un fil pour “sauter” à une autre méthode.

J’ai essayé le service Windows à nouveau et je sais qu’il “déplacé” à la nouvelle méthode que le thread a indiqué parce que j’avais une entrée de journal là-bas qui a jeté une erreur ExceptionFormat en raison d’une conversion que je faisais. J’ai commenté la conversion et le service Windows a tout juste commencé à démarrer, puis s’est arrêté automatiquement.

D’autres recherches m’ont indiqué que je pourrais avoir besoin d’une boucle pour conserver le traitement au sein de la méthode. J’ai donc pris les informations du service C-Windows et mis en place une boucle while infinie. J’ai également constaté qu’il pourrait y avoir une collecte des ordures en cours et établi une déclaration KeepAlive pour les temporisateurs, comme suggéré dans la section Exemples de la classe de minuteur MSDN . Toujours les mêmes problèmes.

À ce stade, j’estime que j’ai épuisé toutes les recherches que je peux faire, il conviendrait de poster ma question ici. Tout mon code est ci-dessous et je noterai qu’avant d’effectuer toute modification, j’ai désinstallé le service Windows, supprimé le projet d’installation et supprimé les programmes d’installation du code C #. J’ai ensuite apporté des modifications et recommencé avec les instructions de la procédure pas à pas à partir du moment où il indique comment configurer les programmes d’installation. Je l’ai fait à chaque fois parce que j’ai constaté que si je faisais des changements et ne désinstallez pas le service Windows, supprimez le projet d’installation et supprimez les programmes d’installation, mes modifications ne prendront pas effet sur le service Windows actuellement installé.

Toute aide que vous pouvez apporter serait très appréciée. Je serai là pour 15 minutes et je vérifierai cette première chose 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(ssortingng[] 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.ToSsortingng()); //double pTimerValue = Convert.ToDouble(pTimer.ToSsortingng()); while (1 > 0) { //if (iTimerValue % 1800000 == 0) //if the timer hits the 30min mark //{ // logFile.SendToLog("Current iTimer Value = " + iTimerValue.ToSsortingng()); //} //if (pTimerValue % 1800000 == 0) //if the timer hits the 30min mark //{ // logFile.SendToLog("Current pTimer Value = " + pTimerValue.ToSsortingng()); //} 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 ssortingng GetDate() { ssortingng current = "No Date Recorded"; try { current = DateTime.Now.ToSsortingng("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.DESIGNER.CS (le produit précédent)

 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; 

Vous n’avez pas besoin de créer un thread séparé ou de vous soucier du ramasse-miettes. Le framework gère tout cela pour vous. Il suffit de créer les minuteurs et ils seront appelés. Voici un exemple.

 public partial class Service1 : ServiceBase { private Timer timer; public Service1() { InitializeComponent(); } protected override void OnStart(ssortingng[] args) { timer = new Timer(1000); timer.Elapsed += new ElapsedEventHandler(timer_Elapsed); timer.Start(); } void timer_Elapsed(object sender, ElapsedEventArgs e) { using (StreamWriter writer = File.AppendText(@"C:\Users\alfonso\Desktop\log.txt")) { writer.WriteLine(ssortingng.Format("{0} : {1}", DateTime.Now, "Logging from the service")); } } protected override void OnStop() { } } 

Quelque chose d’autre qui pourrait aider quelqu’un à trouver cet article et les solutions ci-dessus ne fonctionnent pas. Lorsque j’ai eu ce problème, je l’avais ajouté à la configuration de mon service Windows:

    

J’ai ajouté ceci afin que je puisse joindre le débogueur au service lors de son exécution locale, mais lorsque j’ai essayé de déplacer le service vers un autre serveur, il a généré l’erreur spécifiée. En supprimant cela de la configuration, le service a fonctionné à nouveau.