c# Nicht beenden windows-Dienst
Ich habe einen Windows-service, der löst einen thread auf OnStart(string[] args)
. Es gibt andere threads erstellt, die von diesem Haupt-thread. Nach der Installation und dem Start des service, wenn ich versuche, den Dienst zu beenden ich bin nicht in der Lage, den Dienst zu beenden, während der erste Versuch. Wenn ich einen Rechtsklick auf mein service und request 'Stop'. Ich bekomme die folgende Ausnahme ausgelöst und der Dienst noch ausgeführt wird.
Windows konnte nicht aufhören, den Dienst auf dem Lokalen Computer. Der Dienst hat keinen Fehler zurück. Dies kann einen internen windows-Fehler oder einen internen Dienstfehler handeln.
Wenn das problem weiterhin besteht, Kontaktieren Sie Ihren system-administrator.
Wenn ich versuche, ihn zu stoppen wieder, dass ich am Ende mit anderen Nachricht als
Windows konnte nicht aufhören, den Dienst auf dem Lokalen computer.
Fehler 1061: Der Dienst kann nicht akzeptieren, control-Nachrichten in dieser Zeit.
aber der service ist gestoppt. So trete ich mit der rechten Maustaste -> Stop, zweimal um einen Dienst zu stoppen.
Habe ich versucht abzubrechen thread und beenden Sie den Dienst wie unten, aber kein Gewinn.
protected override void OnStop()
{
onStartThread.Abort();
Log.AuditEventLogger("Service Stopped");
this.Stop();
}
Ich sehr zu schätzen, Anregungen. Danke.
- Aus Interesse, wie beginnst du deinen thread? Ist es ein hintergrund-thread? Wenn nicht, müssen Sie möglicherweise, um es ein - msdn.microsoft.com/en-us/library/...
- Sehen Sie, wenn diese andere Frage, die Ihnen hilft: stackoverflow.com/questions/4885080/...
- protected override void OnStart(string[] args) { onStartThread = new Thread(() => DataFeedScheduler.Start()); onStartThread.Priority = ThreadPriority.Normal; onStartThread.Start();}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens, Sie sind Berufung
this.Stop
welche dann rufen Sie IhrenOnStop
Methode wieder. Sie haben eine unendliche Schleife, so dass Ihr Dienst ist nicht zu stoppen.Zweitens, gehen Sie nicht den Abbruch Ihres threads wie diesen. Signal aufzuhören z.B. mit einer wait-handle (
ManualResetEvent
), und sich der thread. Wenn Sie mit Aufgaben, die dann mit einemCancellationToken
.Basierend auf Ihrem code-snippet in die Kommentare, ich würde empfehlen, zu deinem thread einen hintergrund-thread. Standardmäßig ich glaube, es wird ein Vordergrund-thread und so, wenn es besetzt ist, wird aufhören, Ihre proecess beenden.
Sehen MSDN für mehr detail.
Jedoch, wie Sie zur Verfügung gestellt hast viel detail in der Frage, es kann gut sein, andere Faktoren spielen auch.
Nicht unbedingt immer Abbrechen, den thread.
Wird beim Aufruf der Abort-Methode zu zerstören, ein thread, der common language runtime löst eine ThreadAbortException. Es gibt keine Garantie, dass der thread jemals enden wird. Wenn Sie warten wollen, bis der abgebrochene thread beendet ist, können Sie rufen Sie die Thread.Join-Methode. Join ein blockierender Aufruf, nicht zurück, bis der thread tatsächlich beendet die Ausführung.