Hallo,
Ich habe eine Windows-Applikation und einen Service programmiert.
Über die Windows-Applikation soll der Service beendet werden.
Jetzt kommt das Problem:
Der Service darf nicht immer beendet werden, d.h. wenn ich den Service beenden will, muss der Service zuerst überprüfen, ob er gerade arbeitet. Falls dies zutrifft, muss er das Beenden verhindern.
Mit dem ServiceController beende ich den Service. Das Ereignis OnStop wird aufgerufen.
Wie kann ich das Beenden des Services abbrechen?
Hallo T_B__,
Wenn der Dienststeuerungs-Manager einen Befehl zum Beenden empfängt, überprüft er anhand des Werts von CanStop, ob der Dienst Befehle zum Beenden zulässt
herbivore
Dann muss ich immer, wenn mein Timer was ausführt, den Wert von CanStop auf false setzen, so z.B.:
OnTimer()
{
CanStop = false;
//...
//...
CanStop = true;
}
Hi herbivore,
CanStop kann man nach dem Starten nicht mehr ändern.
Ich kann damit das Beenden nicht verhindern. 🙁
Nur wenn bei deinem Service CanStop auf true gesetzt ist, ist es überhaupt zulässig, ihn zu beenden.
Wird eine solche Anforderung ausgelöst, wird OnStop() aufgerufen.
Falls der Zeitpunkt deinem Service gerade nicht passt, muss sich dieser mit RequestAdditionalTime() zusätzliche Zeit erbitten, sonst wird er als nicht reagierend eingestuft.
Zusätzlich solltest du den Status des Service auf STOP_PENDING setzen.
Genrell kannst du ein Stoppen aber nicht abwenden. Dies stellt keine Frage, sondern eine Aufforderung dar.
Schau dir mal den sehr guten Code in der MSDN zu "ServiceBase Class" an.
Muss ich den Status wirklich auf STOP_PENDING setzen?
Wird der Status nicht automatisch gesetzt?
Wenn ich den Status selber setzen muss, WIE?
Schau dir mal den sehr guten Code in der MSDN zu "ServiceBase Class" an.
Ich bin mir nicht sicher. Da der Status allerdings in der MSDN von Hand gesetzt wurde, habe ich das auch immer gemacht. Habe das Verhalten aber noch nie getestet.
EDIT: Nach kurzem Nachlesen habe ich festgestellt, dass der Status nur bei OnStart() gesetzt wird. Könnte beim Rest daher wirklich unnötig sein.
Hoi T_B__,
mal abgesehen davon, dass ich noch keinen Service unter .NET programmiert habe^^
NIEMALS das stoppen eines Services verhindern
Grund:
wenn der Service-Control-Manager nicht nach einer gewissen Zeitspanne eine befriedigende Response von deinem Service erhält, so bleibt der Status auf "wird beendet" stehen - und kein Admin kann mehr eingreifen. Die einzige Möglichkeit ist, den Server neu zu starten. Dies ist (seit 2k) noch nicht mal beim Treiber installieren notwendig. Wenn beim herunterfahren der Service immernoch nicht beendet werden kann, so steht der Server. Den Timeout konnte ich noch nie abwarten und muste immer nach ca. 20 min. resetten ... Nicht gut ...
🙂
cu Xynratron
Herr, schmeiss Hirn vom Himmel - Autsch!
Die Erfahrung zeigt immer wieder, dass viele Probleme sich in Luft auslösen, wenn man sich den nötigen Abstand bzw. Schlaf gönnt.
Mit RequestAdditionalTime() kann ich mehr Zeit erbitten.
Ich weiß aber nicht, wieviel Zeit der Service noch braucht um seine Aufgabe zu erledigen.
Kann ich so lange RequestAdditionalTime() aufrufen, bis die Aufgabe erledigt ist?