2010-10-25 13 views
5

Ich verwende das folgende Codefragment, um einen Dienst zu beenden. Beide Console.Writeline-Anweisungen geben jedoch an, dass der Dienst ausgeführt wird. Warum hört der Service nicht auf?Windows-Dienst wird nicht gestoppt/gestartet

+0

Wo Sie Benutzername und Passwort verwenden Sie ?? – Aliostad

+0

Ich benutze es weiter unten im Code, wo ich das Konto und das Passwort für den Dienst ändern. – xbonez

Antwort

5

Sie müssen sc.Refresh() aufrufen, um den Status zu aktualisieren. Weitere Informationen finden Sie unter http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.stop.aspx.

Außerdem kann es einige Zeit dauern, bis der Dienst beendet wird. Wenn die Methode sofort zurückkehrt, kann es sinnvoll sein, Ihre Shutdown in etwa wie folgt zu ändern:

// Maximum of 30 seconds. 

for (int i = 0; i < 30; i++) 
{ 
    sc.Refresh(); 

    if (sc.Status.Equals(ServiceControllerStatus.Stopped)) 
     break; 

    System.Threading.Thread.Sleep(1000); 
} 
+0

funktioniert. Vielen Dank! – xbonez

1

Try calling: zu Status-

sc.Refresh(); 

vor Ihrem Anruf.

2

Rufen Sie sc.Refresh() auf, bevor Sie den Status überprüfen. Es könnte auch einige Zeit dauern, um aufzuhören.

0

Haben Sie die richtigen Rechte zum Stoppen/Starten eines Dienstes?

Auf welches Konto führen Sie Ihre Konsolen-App? Administratorrechte?

Haben Sie sc.WaitForStatus versucht? Es kann sein, dass der Service stoppt, aber nicht, wenn Sie Ihre Schreibzeile erreichen.

1

Ich glaube, Sie sc.stop verwenden sollten, und dann aktualisieren http://msdn.microsoft.com/en-us/library/system.serviceprocess.servicecontroller.refresh(VS.80).aspx

// If it is started (running, paused, etc), stop the service. 
// If it is stopped, start the service. 
ServiceController sc = new ServiceController("Telnet"); 
Console.WriteLine("The Telnet service status is currently set to {0}", 
        sc.Status.ToString()); 

if ((sc.Status.Equals(ServiceControllerStatus.Stopped)) || 
    (sc.Status.Equals(ServiceControllerStatus.StopPending))) 
{ 
    // Start the service if the current status is stopped. 

    Console.WriteLine("Starting the Telnet service..."); 
    sc.Start(); 
} 
else 
{ 
    // Stop the service if its status is not set to "Stopped". 

    Console.WriteLine("Stopping the Telnet service..."); 
    sc.Stop(); 
} 

// Refresh and display the current service status. 
sc.Refresh(); 
Console.WriteLine("The Telnet service status is now set to {0}.", 
        sc.Status.ToString()); 
1

Versuchen Sie Folgendes:

while (sc.Status != ServiceControllerStatus.Stopped) 
{ 
    Thread.Sleep(1000); 
    sc.Refresh(); 
}