2016-04-01 13 views
-1

Ich habe einen Windows-Dienst. Beim Start prüft es, ob ihm eine Arbeit zugewiesen wurde - und wenn keine vorhanden ist, wird es einfach beendet. Das Problem besteht darin, dass der Wiederherstellungsmechanismus auf Neustart des Dienstes eingestellt ist.Wie kann ich einen Windows-Dienst innerhalb des Dienstes beenden?

enter image description here

Das ist, was ich will, wenn der Dienst berechtigterweise abstürzt, aber nicht, wenn ich den Dienst programmatisch auf meinem eigenen beenden.

Bisher alles, was ich unten habe versucht, hat dazu geführt, in Windows den Dienst automatisch neu zu starten:

Thread th; 
protected override void OnStart(string[] args) 
{ 
    th = new Thread(new ThreadStart(StartMyService)); 
    th.Start(); 
} 

private void StartMyService() 
{ 
    if (WorkAvailable()) { 
     InitWork(); 
    } else { 
     this.ExitCode = 0; // no errors 
     Stop(); 
    } 
} 

protected override void OnStop() 
{ 
    // dispose of things 

    try 
    { 
     if (th != null && th.ThreadState == ThreadState.Running) 
      th.Abort(); 
    } 
    catch { } 

    Environment.Exit(this.ExitCode); 
} 

Ich habe versucht, verschiedene Exitcode-Werte, aber Windows startet immer den Service. Ich habe auch Environment.FailFast mit den gleichen Ergebnissen versucht. Was vermisse ich?

+3

Das ist nicht das, was irgendjemand von einem Dienst erwarten würde, auch nicht das Betriebssystem. Wenn ein Dienst ausgeführt wird, erwarten Sie, dass er * in regelmäßigen Abständen * überprüft, ob Arbeiten ausgeführt werden müssen, ohne ständig gestoppt und neu gestartet zu werden. Verwenden Sie einen Timer. –

Antwort

4

Wenn das Problem ignoriert wird, ob dies ein gutes Design ist oder nicht, liegt der Grund dafür, dass das Betriebssystem die Fehlerbehebungsaktion verwendet, darin, dass der Dienst fehlschlägt.

Wenn Sie Stopp aufrufen, markiert die Laufzeit den Dienst als angehalten. Es ruft dann die OnStop-Methode auf. Wenn die OnStop-Methode zurückgegeben wird, wird die Bereinigung beendet und der Dienst beendet. Wenn dies der einzige Dienst in der ausführbaren Datei ist, wird die ausführbare Datei ebenfalls beendet. Es besteht nie die Notwendigkeit, den Prozess selbst zu beenden.

Wenn Sie Environment.Exit (oder Environment.FailFast) aufrufen, bewirken Sie, dass die ausführbare Datei des Dienstes plötzlich beendet wird, während sie im ServiceControlManager noch als ausgeführt aufgeführt ist. Das Betriebssystem wird daher zu Recht als fehlgeschlagen betrachtet.