2009-08-10 11 views
7

Escribí un servicio de Windows y una guía para ello. Por supuesto, la GUI depende principalmente del servicio. ¿Hay alguna forma de que GUI espere el servicio? A veces necesito volver a cargar la configuración del servicio desde la interfaz gráfica de usuario y reiniciar el servicio.¿Cómo hacer que la GUI espere al servicio de Windows?

Estaba pensando en 2 soluciones: 1. utilizando tiempo y el sueño que esperar a que el estado de controlador de servicio al cambio (por supuesto, la solución más sencilla: P) 2. implementin interfaz INotifiPropertyChanged algún lugar (esto se ve a lo complicado de este trivial problema).

Me preguntaba ¿hay una forma más elegante de hacerlo? ¿Hay algún evento que me falta en algún lado?

Respuesta

8

ServiceController tiene un método WaitForStatus donde se le pasa un argumento de tipo ServiceControllerStatus. Puede usarlo así:

controller.WaitForStatus(ServiceControllerStatus.Running); 
+0

único problema con eso es que le dice cuándo se está ejecutando el servicio, no cuando el servicio se ha inicializado y está listo para hacer las cosas que desea. Puede ser suficiente para el OP, puede que no. – gbjbaanb

+0

No estoy seguro, pero creo que el estado es ServiceControllerStatus.Running cuando el servicio está completamente inicializado (después de haber llamado al método OnStart). Antes de eso, es ServiceControllerStatus.StartPending. –

+2

Esto es exactamente lo que necesitaba. Perdón por no haber notado este método. Aparte de eso bebí mucho café, estaba buscando un evento: P (mi mal). Solo como una adición al caso: necesitaba usar el método Refresh() para actualizar los datos del servicio. De lo contrario, se mostraba como ejecutándose incluso después de Stop() (pero podría estar conectado con Windows 7 que estoy usando). – kyrisu

1

Utilice un kernel Event object. Cuando inicie ambas aplicaciones, haga que creen o abran un objeto Evento con nombre, luego espere. El otro puede señalarlo, volteando el estado permitiendo que la otra aplicación deje de esperar y ejecutar.

+2

lol Creo que MIS vinculado que url –

+0

Es una pantalla de plasma muy agradable. :-) –

+0

hrmph. Pero yo * quiero * ese plasma tanto :) Corregí el enlace, ¡salud! – gbjbaanb

1

Probablemente generaría un tema aparte para simplemente sondear y ver cuándo ha cambiado el estado de tu controlador de servicio, cuando ocurre el cambio mata este hilo. Después, simplemente volver a desovar el hilo cuando se necesita para empezar a re-sondeo

Darknight

1

Use EventWaitHandle. Su GUI puede esperar en el WaitHandle y el servicio lo configurará, lo que hará que la GUI continúe con lo que estaba haciendo antes de comenzar a esperar. Sin encuestas, sin bucles, sin desorden.

This great article on C# threading es probablemente un mejor recurso para obtener información sobre WaitHandles

0
ServiceController mysqlServiceController = new ServiceController(); 
mysqlServiceController.ServiceName = "MySql"; 
var timeout = 3000; 

myServiceController.Start(); 

try 
{ 
    //Wait till the service runs mysql  
    ServiceController.WaitForStatus(System.ServiceProcess.ServiceControllerStatus.Running, new TimeSpan(0, timeout, 0)); 
} 
catch (System.ServiceProcess.TimeoutException) 
{ 
    MessageBox.Show(string.Format("Starting the service \"{0}\" has reached to a timeout of ({1}) minutes, please check the service.", mysqlServiceController.ServiceName, timeout)); 
} 
Cuestiones relacionadas