Probleme mit Windows-Diensten und ServiceController.Status

  • Themenstarter Themenstarter deep_havoc
  • Beginndatum Beginndatum
D

deep_havoc

Hi,
ich habe ein Probleme beim Verwalten von Windows-Diensten unter VB.Net.
Über die Klasse System.ServiceProcess.ServiceController möchte ich einen Dienst abhängig von einer Variable entweder starten oder stoppen lassen.
Das ganze lasse ich in einer Schleife laufen und immer wieder checken, ob sich die Variable verändert hat.
Am Anfang der Klasse wird das Objekt der Klasse wie folgt erstellt:

Code:
Private ServiceController As New System.ServiceProcess.ServiceController _
("Messenger", "W2K-O20126-6")

später wird dann in einer Methode folgendes Ausgeführt:

Code:
If clientconnected = True Then
            If ServiceController.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Running)  _
= True Then
                ServiceController.Stop()
            End If

        ElseIf clientconnected = False Then

            If ServiceController.Status.Equals(System.ServiceProcess.ServiceControllerStatus.Stopped) _
 = True Then
                ServiceController.Start()
            End If

        End If

Das ganze funktioniert beim 1. mal sehr gut, doch wenn die Variable den Zustand von False auf True (oder umgekehrt) bekommen, wird der ServiceController.Status wohl nicht mehr richtig erkannt und die Prozedur versucht den Dienst das zweite mal zu starten oder zu beenden, was freilich nicht ohne Fehler funktioniert.

Hat da jemand Erfahrung und kann mir einen Tipp geben ?
Das Problem fuchst mich schon seit Stunden... !
Vielen Dank im voraus...
 
Ahh ich habe das problem auf Umwegen gelöst.
Irgendwie ist der Refresh der Klasseneigenschaft ServiceController.Status nicht so ganz der schnellste oder sauberste. Deshalb lasse ich jetzt Proschleifen durchlausch ein neues Objekt erstellen. Dann ist die Eigenschaft zum Zeitpunkt der Prüfung immer aktuell.

Ich weiß nicht ob das die feine englische Art ist, weil ich neu in .Net und der objektorientierten Programmierung überhaupt bin. Ich meine damit, dass ich mir vielleicht den Speicher mit immer neuen Objekten zu setzte. Doch laut meinem Verständnis sollte in dem Augenblick, wo das neue Objekt erstellt wurde keine Referenze mehr zum alten führen, d.h. der Garbage Collector sollte die alten Objekte aus dem Speicher entfernen. Ist das so ? Wenn nicht korrigiert mich, bitte...

...Vielen Dank
 
Hi deep_havoc,

du hast vollkommen recht, das SOLLTE so sein.
Aber der GC von VB.NET ist genauso zuverlässig wie der von Java.......
In Regel funktioniert das zwar ganz gut, aber in Ausbnahmefällen muss man ihn eben zu seinem Glück zwingen...

wenn das nicht hilft :
ServiceController = nothing

kannst du auch mal das probieren :

GC.Collect() 'Collect the current Objects
GC.WaitForPendingFinalizers() 'wait for the Objects marked to be finalized
GC.Collect() 'collect the objects again

Die Zeilen jeweils nach einem Durchlauf einfügen.
Die unteren 3 Codezeilen sollten eine mögliche Freigabe beschleunigen. Wenn das auch nicht geht, kommst du um einen tieferen Einstieg in den Garbage Collector nicht rum. Und das ist echt eklig.

Gruss
Christian
 
Zurück