C# - Windows-Dienst Gestartet und dann Automatisch Gestoppt

Ich bin erstellen dieser windows-Dienst, indem Sie die folgenden Anweisungen bei MSDN Exemplarische Vorgehensweise: Erstellen eines Windows-Dienstes und nach erfolgreicher installation, ich gehe zu Dienstleistungen.msc, um den Windows-Dienst Starten und bevor es gestartet wurde bekomme ich folgende Meldung:

Den EIWindowsService Dienst auf "Lokaler Computer" gestartet und dann angehalten. Einige Dienste werden automatisch angehalten wenn Sie nicht von anderen Diensten oder Programmen.

Ich weiß, der Windows-Dienst beginnt auch in Ordnung, denn es ist ein Eintrag in die log-Datei, die besagt, dass der Dienst gestartet wurde. Ich habe einige der Forschung vor dem posten hier und die Antwort von Einige Dienste Werden Automatisch Angehalten Staaten, die das problem könnte entweder sein, dass die OnStart-Methode wirft einen Fehler, oder dass der OnStart ist nicht Auftakt eines Threads. Also modifizierte ich meinen code so, dass das einzige, was in der OnStart ist der Ausgangspunkt der beiden Timer und den log-Eintrag, daher brauchen keine Ausnahmebehandlung. Ich habe auch einen thread zu "springen" auf eine andere Methode.

Habe ich versucht, den windows-Dienst erneut, und ich weiß, dass es "verschoben", um die neue Methode, die der thread hingewiesen, weil ich hatte einen log-Eintrag gibt, warf aFormatException Fehler durch einige conversion-ich war dabei. Ich auskommentiert, die Umwandlung und den windows-Dienst immer noch nur begann zu starten und dann automatisch gestoppt.

Weiteren Untersuchungen zeigten mir, dass ich vielleicht brauchen Sie eine Schleife, um die Verarbeitung innerhalb der Methode, so habe ich Informationen aus C - Windows-Dienst den Dienst auf und eine unendliche while-Schleife. Ich fand auch, dass es sein könnte, Garbage Collection geht auf und gründete eine KeepAlive-Anweisung für die Timer wie vorgeschlagen im Abschnitt "Beispiele" von MSDN Timer-Klasse. Immer noch die gleichen Probleme.

Zu diesem Zeitpunkt habe ich das Gefühl, exhaused alle Forschung, die ich tun kann, so wäre es sinnvoll, zu posten, hier meine Frage. Alle mein code ist unten, und ich werde beachten Sie, dass, bevor ich ausgeführt, jede änderung, die ich deinstalliert, der Windows-Dienst, entfernt das Setup-Projekt, gelöscht und die Installateure von der C# - code. Ich habe dann änderungen vorgenommen und begann wieder mit den Anweisungen in der Exemplarischen Vorgehensweise ab dem Punkt, wo es weist, wie das einrichten der Installer. Ich Tat dies jedes mal, weil ich fand, dass wenn ich die vorgenommenen änderungen nicht deinstallieren, der Windows-Dienst entfernen Sie das Setup-Projekt, und löschen Sie die Installationsprogramme, dann werden meine änderungen nicht wirksam, der auf die aktuell installierte windows-service.

Jede Hilfe, die Sie geben können, würden die meisten geschätzt werden. Ich werde hier sein, für weitere 15min und dann werde ich schauen, das erste, was morgen ist.

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.DESIGNER.CS (die maßgeblich Zeug)

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;

InformationsquelleAutor Invaderleige | 2011-09-10

Schreibe einen Kommentar