2012-11-19 4 views
14

Ich habe einen Windows-Dienst in C# geschrieben, die eine Menge Daten verarbeiten. Wenn wir aufhören, versuchen Sie es für 20/30 Sekunden und dann löst Ausnahme aus.Was ist die maximale Zeit Windows-Dienst warten, um Stop-Anfrage zu verarbeiten und wie für zusätzliche Zeit anfordern

Ich möchte ServiceBase.RequestAdditionalTime() im OnStop-Ereignis implementieren.

Ich möchte die genaue Zeitüberschreitung wissen, nach der Windows-Dienst die Ausnahme auslöst, so dass ich kurz davor noch zusätzliche Zeit anfordern kann.

Ich suchte, fand aber nicht diesen Standard-Stop-Timeout-Wert.

+1

IIRC ist es 30 Sekunden - http://www.itgeekdiary.com/increase-the-service-timeout-period/ – Lloyd

Antwort

28

Ich schrieb den folgenden Code, um es zu erreichen.

protected override void OnStop() 
{ 
    int timeout = 10000; 
    var task = Task.Factory.StartNew(() => MyTask()); 
    while (!task.Wait(timeout)) 
    { 
     RequestAdditionalTime(timeout); 
    } 
} 

Der obige Code beginnt eine Aufgabe in parallel zum Hauptgewinde (Task-Start sofort ausgeführt wird), nächste Zeile zu überprüfen ist, ob Task alle 10 Sekunden abgeschlossen ist oder nicht und wenn es nicht abgeschlossen ist, fordert er weitere 10 Sekunden und überprüfen, bis die Aufgabe abgeschlossen ist.

+1

+1 für die Eleganz der Lösung. –

1

standardmäßig Ich glaube, es 12000 Millisekunden ist, um es zu ändern müssen Sie Registrierungs HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ WaitToKillServiceTimeout für den Zugriff auf und ändern Sie den Wert

aber Sie können Ihre eigene Zeit heraus definieren, wenn Sie wollen um es zu starten oder es Programmierung stoppen hier Sie für Ihre eigene Zeit definieren out

TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 
service.Start(); 
service.WaitForStatus(ServiceControllerStatus.Running, timeout); 

Start und hier definieren Sie zum anhalten Ihrer eigenen Zeit heraus

TimeSpan timeout = TimeSpan.FromMilliseconds(timeoutMilliseconds); 
service.Stop(); 
service.WaitForStatus(ServiceControllerStatus.Stopped, timeout); 
+0

Dies wird nicht helfen, wenn mit integrierten Windows-Tools wie 'sc.exe' oder die" Dienstleistungen "mmc addin. –

+0

wahr, aber was ich eingeschlossen ist, zu stoppen und neu starten grammatikalisch –

+0

Dann sollten Sie diese Tatsache angeben. Denn streng genommen ist dies keine Antwort auf die OP-Frage. –

5

Es ist in der Registrierung auf Unterschlüssel festgelegt:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control 

mit String-Wert WaitToKillServiceTimeout. Wenn nicht definiert, wird standardmäßig 20000 (ms) verwendet. Auf meinem Rechner scheint es auf 12000 (12s) eingestellt zu sein. Ich habe es nie berührt.

1

Führen Sie einfach immer die mit der maximalen Zeit, die Sie erwarten, dass Ihr Dienst für das Herunterfahren benötigt. Es ist kein Fehler, früher zu beenden als vorhergesagt.

+0

Service Prozessdaten basierend auf empfangenen Daten und das ist unbekannt Größe, so dass ich nicht weiß, wie viel Zeit es dauern wird zu stoppen. es sollte nicht aufhören, bevor alle Daten verarbeitet werden –

+3

Ja, sollte es. Empfangene Daten sollten in einer Warteschlange auf der Festplatte gespeichert werden (damit nichts verloren geht, wenn der Strom ausfällt) und von dort verarbeitet werden. Die Hauptgründe, warum ich einen Dienst stoppe, sind a) Neustarts (mit denen ich schnell fertig werden möchte) und b) wenn der Dienst nicht funktioniert (in diesem Fall möchte ich nicht, dass er die restlichen Anfragen bearbeitet). –

14

Obwohl eine Reihe von Menschen, die HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitToKillServiceTimeout Registrierungsschlüssel erwähnt, nach this "Service Control Handler" article from Microsoft dass Registrierungseintrag nur steuert die maximale Anzahl von Mal, wenn ein Service in Anspruch nehmen kann herunterzufahren, wenn Windows selbst heruntergefahren oder neu gestartet wird:

< ...> einen Dienst, um zu verhindern Shutdown stoppen, gibt es eine Grenze , wie lange die Dienststeuerung wartet. Wenn der Dienst über das Dienste-Snap-In geschlossen wird, beträgt das Limit 125 Sekunden. Wenn das Betriebssystem neu gestartet wird, wird das Zeitlimit im WaitToKillServiceTimeout Wert < ... festgelegt.>

Wenn Windows nicht in den Prozess neu zu starten oder herunterzufahren, dann ist die Standard viel Zeit Windows für einen Dienst warten 30 Sekunden heruntergefahren ist. Anwendungen können jedoch Anforderungen für zusätzliche Zeit stellen, die insgesamt bis zu 125 Sekunden (über alle Anforderungen hinweg) eingehalten werden.

Unter Windows Server 2003 und später dieses Standard-Timeout kann über die HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\ServicesPipeTimeout Registrierungsschlüssel geändert werden, wie in this Microsoft support article (und this ServerFault question) beschrieben. Es ist nicht klar, ob dies für Windows 7/8/10 gilt, da der Artikel nur Serverversionen erwähnt.

Wenn ein Neustart/shutdown auf der Maschine gestartet wurde, wird der WaitToKillServiceTimeout Registrierungsschlüsselwert (falls vorhanden) gibt die maximale Menge an Zeit wird Windows die Anwendung erlaubt erlauben wird, das Überschreiben des O Standard.

Vermutlich ist dies so, dass Anwendungen das Herunterfahren nicht beliebig über den Standardwert hinaus verzögern können (oder was der Administrator über den Registrierungseintrag WaitToKillServiceTimeout angegeben hat).

Verwandte Themen