2010-09-15 15 views
6

Soy un principiante completo para trabajar con servicios de Windows. Tengo un esqueleto básico elaborado por el servicio y actualmente estoy haciendo esto:Cómo ejecutar un exe del servicio de Windows y detener el servicio cuando se cierra el proceso de ejecución?

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

sólo para el fuego-off el exe al inicio del programa.

Sin embargo, me gustaría que el servicio se detenga solo cuando comience el proceso desde el comando exe. Estoy bastante seguro de que necesito hacer algún tipo de subprocesamiento (algo con lo que también soy principiante), pero no estoy seguro del esquema general de cómo funciona esto, ni de la forma específica de detener un proceso desde sí mismo. . ¿Podría ayudarme con el proceso general para esto (es decir, iniciar un hilo de OnStart, entonces qué ...?)? Gracias.

Respuesta

9

Puede usar un BackgroundWorker para el enhebrado, use Process.WaitForExit() para esperar a que el proceso finalice hasta que pare su servicio.

Tiene razón de que debe hacer algunos subprocesos, haciendo mucho trabajo en el OnStart puede presentar errores acerca de no iniciarse correctamente desde Windows al iniciar el servicio.

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(); 
} 

Editar También es posible que desee mover el Process p a un miembro de la clase y detener el proceso en el OnStop para asegurarse de que puede detener el servicio de nuevo si el exe se vuelve loco.

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

Gracias, esto funcionó exactamente como esperaba. – xdumaine

1

someProcess.exe debe tener someLogic para detener el servicio de llamadas;)

utilizar la clase ServiceController.

// 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()); 

El código pertenece a la página vinculada anteriormente.

+0

Gracias, parece que podría lograr el resultado final, si también estoy desarrollando el exe. ¿No es esto más una solución alternativa que una solución? Y solo funcionaría suponiendo que estoy escribiendo el .exe. Supongamos que no tengo acceso a la fuente para el exe, y esto todavía debe poder hacerlo a través del servicio de Windows. – xdumaine

2

usted tiene que utilizar un ServiceController hacerlo, tiene un método Stop. Asegúrese de que su servicio tenga la propiedad CanStop establecida en verdadero.

Cuestiones relacionadas