Announcement

Collapse
No announcement yet.

Windows-Dienst programmieren

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Windows-Dienst programmieren

    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

  • #2
    Hallo,

    was passiert, wenn der Thread in seiner Schleife < 30 Sekunden wartet? Der SCM (Service Control Manager) von Windows verwendet einen 30-Sekunden-Timeout für das Kontrollieren der Dienste, d.h. der Dienst sollte innerhalb dieser Frist auf das Anhalten/Weiterlaufenlassen reagieren

    Comment


    • #3
      Ich habe das Problem gefunden. Es lag an der Konfigurationsdatei. Die hatte er nicht gefunden.

      Entschuldige dir Störung, und Danke nochmal für die schnelle Antwort.

      Andrea

      Comment

      Working...
      X