Ich habe einen Windows-Dienst, der einen Thread in der OnStart-Methode startet.
Grundsätzlich möchte ich den Dienst stoppen können, wenn etwas wirklich schief geht (wie eine unbehandelte Ausnahme).
Momentan verwende ich ServiceBase.Stop()
, aber das beinhaltet, dass eine ServiceBase
-Instanz irgendwo für den Thread sichtbar ist, was wiederum beinhaltet, dass meine Instanz im Hauptprogramm als public static
deklariert wird.
Gibt es einen "besseren Weg", den Dienst zu stoppen? Wenn es nicht ... ist es sicher, es so zu machen?
Der einfachste und meiner Meinung nach sauberste Weg ist die Verwendung einer öffentlichen statischen Eigenschaft der Serviceklasse. Dies funktioniert nur, wenn Sie dieselbe Dienstklasse verwenden, um mehrere Dienste im selben Prozess auszuführen, was sehr selten ist.
%Vor%Das Einfügen der Dienstinstanz in jede Methode, die sie möglicherweise benötigt, ist eine Alternative, aber sie kann schnell unordentlich werden und hat keine wirklichen Vorteile gegenüber der Verwendung einer statischen Eigenschaft.
Sehen Sie sich das Beispiel hier zur Verwendung der ServiceController-Klasse an um Dienste zu starten und zu stoppen.
Alternativ können Sie Ihre Dienstinstanz an den Thread übergeben, wenn Sie ihn erstellen (oder ihn als Instanzvariable in der Thread-Klasse usw. festlegen), ohne dass Ihre Serviceklasse statisch sein muss.
Ein kurzes Beispiel für die Vollständigkeit:
%Vor%Tags und Links .net c# windows-services multithreading