2017-12-28 33 views
0

Ich habe einen C# Windows Service. Ich habe folgende EreignisseGibt es einen OnRestart() - Ereignis-Listener für einen C# -Windows-Dienst? Wie kann ich sehen, ob der Windows-Dienst neu gestartet wurde?

protected override void OnStart(string[] args) 
{  
    string url = "http://localhost:8080"; 
    SignalR = WebApp.Start(url); 
    eventLog1.WriteEntry("Server running on " + url); 
} 

protected override void OnStop() 
{ 
    eventLog1.WriteEntry(LogMessage.Message); 
    SignalR.Dispose(); 
} 

Das Problem ist, dass ich ein

Environment.Exit(1);

wenn mein Service-Code abgeschlossen hat ausgeführt tue seine Operationen, ich habe Eigenschaften, die in meinem Dienst, so dass es neu gestartet nach 1 Minute (wenn es einen Fehler erhält). Es scheint, dass wenn es scheitert, es nicht tatsächlich das "stop" -Ereignis trifft, so wird mein Protokoll nie geschrieben. Gibt es ein

OnRestart()

Ereignis oder so etwas? Ich versuche herauszufinden, wie ich mein Protokoll ausschreiben kann, bevor ich den Dienst verlasse. Es würde normalerweise das Protokoll schreiben, wenn ich manuell auf "Dienst beenden" aus dem Dienstdialogfeld in Windows klickte. Aber ich stoppe nicht länger manuell auf stop, um den Dienst zu beenden, ich starte ihn automatisch neu und erzwinge einen Fehler im Dienst, so dass ich ihn nicht manuell anhalten und neu starten muss.

Sie würden denken, ich würde nur in der Lage sein

eventLog1.WriteEntry("blah blah"); 

zu tun, bevor ich den Code verlassen, aber ich kann nicht, weil es außerhalb des Gültigkeitsbereichs ist und ich den Code in einer separaten Klasse verlässt :(

+1

Verwenden von Environment.Exit() in einem Service ist einfach grundlegend falsch. Der Service-Manager entscheidet, wann Sie den Vorgang beenden müssen. Implementieren Sie den Betrieb einmal pro Minute mit einem Timer. –

+0

Ich schreibe keine Windows-Dienste mehr. Ich schreibe Konsolen-Apps und lasse ["TopShelf"] (http://docs.topshelf-project.com/en/latest/configuration/quickstart.html) sie als Windows-Dienste ausführen. Sie können bei Start, bei Stopp, bei Ausnahme und einigen anderen Dingen auch angeben - Grunddienst erfordert nur 10 Zeilen Code. –

+0

@HansPassant Falsch, Ihre Meinung ist ** nicht ** Fakt. – Yusha

Antwort

0

können Sie nicht einen try/catch-Block um den Code-Abschnitt wickeln die Arbeit tut? Wenn es aus irgendeinem Grund ausfällt, springt er in diesem catch-Block, wo Sie die OnStop() Ereignis auslösen kann.

try 
    {    
     //Your service code 
    } 

    catch (Exception e) 
    { 
     OnStop(); 
    } 
+0

Das * scheint * wie es funktionieren würde. Ich werde es versuchen. – Yusha

Verwandte Themen