Hallo,
ich habe einen POP3-Scanner als Windowsdienst programmiert. Da dieser Dient auf einem wichtigen Firmenserver eingesetzt werden soll, muss natürlich alles protokolliert werden. Dazu habe ich eine eigene Klasse geschrieben, die die Loggs in einen SQL-DB schreibt. Die Verbindung zum DB-Server habe ich über ein eigenes Konto hergestellt (keine intergrierte Authentifizierung).
Soweit zum Vorspiel.
In der OnStart-Methode des Services steht folgender Code:
<pre>
protected override void OnStart(string[] args)
{
log.CreateLog("Der Dienst wird gestartet!");
//running wird auf true gesetzt
this.running = true;
//!!!ACHTUNG!!! - threadrun wird auf true gesetzt, um Thread zu starten
//ZUORDNUNG NICHT ÄNDERN
this.threadrun = true;
//----------------------
//Ausführungszeit wird ausgelesen
dt_exec = DateTime.Parse(StatSettings.GetSetting("ExecTime") );
//nur wenn der Thread noch nicht initialisiert wurde
if (popCaller == null)
{
//Thread wird vorbeireitet
ThreadStart threadstart_pop = new ThreadStart(Worker);
popCaller = new Thread(threadstart_pop);
}
//Thread wird gestartet
popCaller.Start();
log.CreateLog("Der Dienst wurde erfolgreich gestartet!");
}
</pre>
Im Konstruktor stehen folgende Einstellungen:
<pre>
this.ServiceName = "Name_des_Dienstes";
this.AutoLog = true;
this.CanStop = true;
this.CanPauseAndContinue = true;
this.CanHandlePowerEvent = false;
this.running = false;
</pre>
Des weiteren sind die Funktionen OnStop, OnPause und OnContinue implementiert.
Wenn ich den Dienst installiert habe und starten möchte, kommt vom SCM folgende Meldung:
<b>
Dienst "Name..." wurde auf "Lokaler Computer" gestartet und dann angehalten. Einige Dienste werden automatisch gestartet und dann angehalten, wenn sie sich im Leerlauf befinden, wie z.B. Leistungsprotkoll-und Alarmierungsdienst.
</b>
<br>
Aner in der OnStart wird doch ein Thread gestartet, der immer arbeitet!
<pre>
private void Worker()
{
while (threadrun)
{
if (running)
{
if (DateTime.Now.AddMinutes(-5) <= dt_exec && DateTime.Now >= dt_exec)
{
try
{
//holt die neueste Version der Einstellungsdaten aus der KOnfigurationsdatei
StatSettings.GetSettings();
//erstellt einen Eintrag im Log, dass die Bearbeitung beginnt
log.CreateLog("Bearbeitung beginnt.", LogEntry.Information);
//PopClient mit Benutzerdaten und Speicherort für Daten initialisieren
PopFunc mail = new PopFunc(StatSettings.MailAcount, StatSettings.MailPassword, StatSettings.MailServer, StatSettings.TempStoreDir);
//Abrufen und Verarbeiten der Mails im Postfach
mail.GetMails();
}
catch(Exception ex)
{
//im Fehlerfall einen Eintrag in das Log machen
log.CreateLog(ex.Message, LogEntry.Error);
}
}
}
//versetzt den Thread in den Schlafmodus (für eine Minute)
Thread.Sleep(300000);
}
}
</pre>
Warum funktioniert das nicht?
Kann mir da jemand helfen?
Andreas Gräfe
ich habe einen POP3-Scanner als Windowsdienst programmiert. Da dieser Dient auf einem wichtigen Firmenserver eingesetzt werden soll, muss natürlich alles protokolliert werden. Dazu habe ich eine eigene Klasse geschrieben, die die Loggs in einen SQL-DB schreibt. Die Verbindung zum DB-Server habe ich über ein eigenes Konto hergestellt (keine intergrierte Authentifizierung).
Soweit zum Vorspiel.
In der OnStart-Methode des Services steht folgender Code:
<pre>
protected override void OnStart(string[] args)
{
log.CreateLog("Der Dienst wird gestartet!");
//running wird auf true gesetzt
this.running = true;
//!!!ACHTUNG!!! - threadrun wird auf true gesetzt, um Thread zu starten
//ZUORDNUNG NICHT ÄNDERN
this.threadrun = true;
//----------------------
//Ausführungszeit wird ausgelesen
dt_exec = DateTime.Parse(StatSettings.GetSetting("ExecTime") );
//nur wenn der Thread noch nicht initialisiert wurde
if (popCaller == null)
{
//Thread wird vorbeireitet
ThreadStart threadstart_pop = new ThreadStart(Worker);
popCaller = new Thread(threadstart_pop);
}
//Thread wird gestartet
popCaller.Start();
log.CreateLog("Der Dienst wurde erfolgreich gestartet!");
}
</pre>
Im Konstruktor stehen folgende Einstellungen:
<pre>
this.ServiceName = "Name_des_Dienstes";
this.AutoLog = true;
this.CanStop = true;
this.CanPauseAndContinue = true;
this.CanHandlePowerEvent = false;
this.running = false;
</pre>
Des weiteren sind die Funktionen OnStop, OnPause und OnContinue implementiert.
Wenn ich den Dienst installiert habe und starten möchte, kommt vom SCM folgende Meldung:
<b>
Dienst "Name..." wurde auf "Lokaler Computer" gestartet und dann angehalten. Einige Dienste werden automatisch gestartet und dann angehalten, wenn sie sich im Leerlauf befinden, wie z.B. Leistungsprotkoll-und Alarmierungsdienst.
</b>
<br>
Aner in der OnStart wird doch ein Thread gestartet, der immer arbeitet!
<pre>
private void Worker()
{
while (threadrun)
{
if (running)
{
if (DateTime.Now.AddMinutes(-5) <= dt_exec && DateTime.Now >= dt_exec)
{
try
{
//holt die neueste Version der Einstellungsdaten aus der KOnfigurationsdatei
StatSettings.GetSettings();
//erstellt einen Eintrag im Log, dass die Bearbeitung beginnt
log.CreateLog("Bearbeitung beginnt.", LogEntry.Information);
//PopClient mit Benutzerdaten und Speicherort für Daten initialisieren
PopFunc mail = new PopFunc(StatSettings.MailAcount, StatSettings.MailPassword, StatSettings.MailServer, StatSettings.TempStoreDir);
//Abrufen und Verarbeiten der Mails im Postfach
mail.GetMails();
}
catch(Exception ex)
{
//im Fehlerfall einen Eintrag in das Log machen
log.CreateLog(ex.Message, LogEntry.Error);
}
}
}
//versetzt den Thread in den Schlafmodus (für eine Minute)
Thread.Sleep(300000);
}
}
</pre>
Warum funktioniert das nicht?
Kann mir da jemand helfen?
Andreas Gräfe
Comment