Windowsdienst kann nach Beendigung nicht gleich neu gestartet werden

  • VB.NET

Es gibt 4 Antworten in diesem Thema. Der letzte Beitrag () ist von DirtyHarry.

    Windowsdienst kann nach Beendigung nicht gleich neu gestartet werden

    Hallo, dies mein erste Anfrage in diesem Forum.

    Ich habe einen einfachen Windowsdienst erstellt, wechler über ein separates Programm verwaltet werden kann. Wir der Dienst nun über das Verwaltungsprogramm beendet, kann dieser danach nicht sofort neu gestartet werden. Bei jedem Versuch wird der Dienst sofort wieder beendet. Erst nach ca. 30 Sekunden ist dann ein Neustart möglich. Das gleiche Problem habe ich, wenn ich den Dienst über die Diensteverwaltung von Windows beende und dann wieder neu startet möchte.

    Wie ich nun in bereits mehreren Beiträgen gelesen habe, soll in der Sub "OnStart" nicht direkt Programmcode verwendet werden, da für die Ausführung der hier hinterlegten Anweisungen ein Zeitlimit vorgegeben ist. Daher führe beim Windowsstart alle weiteren Aktionen in einem eingenen Thread aus. Dieser startet wiederum zwei weitere Threads mit unterschiedlichen Aufgaben. Beim Beenden - "OnStop" gehe ich nun wie folgt vor:

    VB.NET-Quellcode

    1. MyServiceThread.Join(TimeSpan.FromSeconds(20))
    2. If (MyServiceThread.ThreadState And ThreadState.Running) = ThreadState.Running Then
    3. MyServerThread.Join(TimeSpan.FromSeconds(5))
    4. If (MyServerThread.ThreadState And ThreadState.Running) = ThreadState.Running Then
    5. MyServerThread.Abort()
    6. End If
    7. MyQueueThread.Join(TimeSpan.FromSeconds(5))
    8. If (MyQueueThread.ThreadState And ThreadState.Running) = ThreadState.Running Then
    9. MyQueueThread.Abort()
    10. End If
    11. MyServiceThread.Abort()
    12. End If

    Es wäre prima, wenn jemend eine Idee hätte, was ich ändern müsste, damit der Dienst sofort wieder gestartet werden kann. Vielen Dank.
    Willkommen im Forum. :thumbup:
    Wenn ich Deine Wartezeiten addiere, komme ich exakt auf die 30 Sekunden, die Du abwarten musst.
    Die Art und Weise, wie Du den Thread beendest, ist suboptimal.
    Gib dem Thread ein Abbruch-Flag, das von diesem hinreichend oft abgefragt wird und ihn veranlasst, sich selbst zu beenden, also einfach die Thread-Prozedur geordnet zu verlassen.
    Das Aktivieren dieses Flags machst Du für alle Threads gleichzeitig.
    Dann kannst Du sagen wir 5 Sekunden warten, bis alle Threads ihre Arbeit beendet haben. Haben sie dies, ist alles in Ordnung.
    Wenn nicht, schießt Du den Thread mit Gewalt ab.
    Wartezeit: vielleicht 2-3 Sekunden. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Vielen Dank für die Antwort.

    In dem Beitrag "VB.NET Tipps: Multithreading" unter msdn.microsoft.com/de-de/library/bb979513.aspx#ID0EJCAC ist das Stoppen eines Threads beschrieben. Meinst Du das mit dem Abbruch-Flag so?

    Hier der Beispielcode von Microsoft:

    VB.NET-Quellcode

    1. Public Class Worker
    2. Private _StopRequested As Boolean = False
    3. Public Sub RequestStop()
    4. _StopRequested = True
    5. End Sub
    6. Public Sub DoWork()
    7. Dim StartTime As DateTime = DateTime.Now
    8. Do
    9. If _StopRequested Then
    10. Exit Do
    11. End If
    12. Loop Until DateTime.Now.Subtract(StartTime).TotalMinutes > 9
    13. End Sub
    14. End Class

    DirtyHarry schrieb:

    Meinst Du das mit dem Abbruch-Flag so?
    Exakt so. :D
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!