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
Du musst angemeldet sein, um einen Kommentar abzugeben.
Müssen Sie nicht erstellen Sie einen separaten thread oder sich sorgen über den garbage collector. Das framework übernimmt alles für Sie. Erstellen Sie einfach den Timer und Sie aufgerufen werden. Hier ist ein Beispiel.
Nein, ich glaube nicht, dass das das problem. Vielleicht etwas in der OnStart-Methode wirft eine Ausnahme, und da sind Sie nur Umgang mit ArgumentOutOfRange Ausnahmen, der service beendet wird.
Alfonso, so nehmen Ihren Kommentar über meine OnStart nur die Handhabung eine ArgumentOutOfRange-Ausnahme, ich habe die Allgemeine Exception-handling in allen Aussagen und den Fehler gefunden war geworfen aus meinem logFile. So es scheint, dass das Problem behoben ist. Vielen Dank für Ihre Hilfe.
InformationsquelleAutor alf
Etwas anderes, das helfen kann, jemand kommt auf diesen Beitrag und die oben genannten Lösungen nicht funktionieren. Als ich dieses problem hatte, habe ich diese in der config-Datei von meiner Windows-Dienst:
Ich Hinzugefügt, damit konnte ich den debugger an den service, wenn es läuft lokal, aber wenn ich versuchte, Sie zu bewegen, den Dienst auf einen anderen server gab es den angegebenen Fehler. Durch entfernen dieser aus der config der service funktionierte wieder.
InformationsquelleAutor Shane Haw