2010-09-15 9 views
6

Ich bin ein absoluter Anfänger mit Windows-Diensten arbeiten. Ich habe ein Grundgerüst für den Dienst gearbeitet und ich zur Zeit tue dies:Wie führe ich eine Exe vom Windows-Dienst aus und stoppe den Dienst, wenn der exe-Prozess beendet wird?

protected override void OnStart(string[] args) 
    { 
     base.OnStart(args); 
     Process.Start(@"someProcess.exe"); 
    } 

nur Feuer-off der exe zu Beginn des Programms.

Ich möchte jedoch, dass der Dienst sich selbst beendet, wenn der Prozess von der Exe gestartet wird. Ich bin mir ziemlich sicher, dass ich eine Art Threading machen muss (etwas, mit dem ich auch Anfänger bin), aber ich bin mir nicht sicher, wie das funktioniert und wie man einen Prozess aus sich heraus stoppen kann . Könnten Sie mir mit dem allgemeinen Prozess dafür helfen (d. H. Einen Thread von OnStart starten, was dann ...?)? Vielen Dank.

Antwort

9

Sie können ein BackgroundWorker für das Threading verwenden, verwenden Sie Process.WaitForExit(), um auf das Beenden des Prozesses zu warten, bis Sie Ihren Dienst beenden.

Sie haben recht, dass Sie einige threading tun sollten, viel Arbeit in der OnStart macht möglicherweise Fehler beim Starten von Windows nicht ordnungsgemäß beim Starten des Dienstes.

protected override void OnStart(string[] args) 
{ 

    BackgroundWorker bw = new BackgroundWorker(); 
    bw.DoWork += new DoWorkEventHandler(bw_DoWork); 
    bw.RunWorkerAsync(); 
} 

private void bw_DoWork(object sender, DoWorkEventArgs e) 
{ 
    Process p = new Process(); 
    p.StartInfo = new ProcessStartInfo("file.exe"); 
    p.Start(); 
    p.WaitForExit(); 
    base.Stop(); 
} 

bearbeiten Sie auch die Process p zu einer Klasse Element bewegen möchten und den Prozess in der OnStop zu stoppen, um sicherzustellen, dass Sie den Dienst wieder zu stoppen, wenn die exe drunter und drüber geht.

protected override void OnStop() 
{ 
    p.Kill(); 
} 
+0

Danke, das hat ziemlich genau so funktioniert, wie ich es mir erhofft hatte. – xdumaine

1

someProcess.exe sollte someLogic haben den Telefonie-Dienst zu stoppen;)

die ServiceController Klasse.

// Toggle the Telnet service - 
// 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()); 

Der Code stammt von der oben verlinkten Seite.

+0

Danke, das sieht aus, als würde es das Endergebnis erreichen - wenn ich die exe auch entwickle. Ist das nicht eher eine Problemumgehung als eine Lösung? Und es würde nur funktionieren, vorausgesetzt, ich schreibe die .exe. Angenommen, ich habe keinen Zugriff auf die Quelle für die Exe, und dies sollte weiterhin über den Windows-Dienst selbst möglich sein. – xdumaine

2

Sie haben eine ServiceController zu verwenden, es zu tun, es hat eine Stop Methode. Stellen Sie sicher, dass Ihr Dienst die CanStop-Eigenschaft auf True festgelegt hat.

Verwandte Themen