Laden...

Service beenden

Erstellt von T_B__ vor 17 Jahren Letzter Beitrag vor 17 Jahren 2.966 Views
T
T_B__ Themenstarter:in
194 Beiträge seit 2006
vor 17 Jahren
Service beenden

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?

L
34 Beiträge seit 2005
vor 17 Jahren

vielleicht hilft dir das ja weiter

Windows Services Admin: Control Your Windows Services

lg live2 🤔

49.485 Beiträge seit 2005
vor 17 Jahren

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

T
T_B__ Themenstarter:in
194 Beiträge seit 2006
vor 17 Jahren

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;
}


T
T_B__ Themenstarter:in
194 Beiträge seit 2006
vor 17 Jahren

Hi herbivore,

CanStop kann man nach dem Starten nicht mehr ändern.
Ich kann damit das Beenden nicht verhindern. 🙁

B
1.529 Beiträge seit 2006
vor 17 Jahren

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.

T
T_B__ Themenstarter:in
194 Beiträge seit 2006
vor 17 Jahren

Muss ich den Status wirklich auf STOP_PENDING setzen?
Wird der Status nicht automatisch gesetzt?

Wenn ich den Status selber setzen muss, WIE?

B
1.529 Beiträge seit 2006
vor 17 Jahren

Schau dir mal den sehr guten Code in der MSDN zu "ServiceBase Class" an.

B
1.529 Beiträge seit 2006
vor 17 Jahren

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.

X
1.177 Beiträge seit 2006
vor 17 Jahren

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.

T
T_B__ Themenstarter:in
194 Beiträge seit 2006
vor 17 Jahren

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?