2009-08-10 14 views
7

Ho scritto un servizio Windows e una GUI per questo. Ovviamente l'interfaccia grafica dipende principalmente dal servizio. C'è un modo per gui di aspettare il servizio? A volte ho bisogno di ricaricare la configurazione del servizio dalla gui e riavviare il servizio.Come rendere la GUI in attesa del servizio Windows?

Stavo pensando di 2 soluzioni: 1. utilizzando durante il sonno e di aspettare per lo stato controller di servizio per cambiare (ovviamente la soluzione più semplice: P) 2. implementin INotifiPropertyChanged interfaccia da qualche parte (questo sembra complicato per questo banale problema).

Mi chiedevo se ci fosse un modo più elegante di farlo? C'è un evento che mi manca da qualche parte?

risposta

8

ServiceController ha un metodo WaitForStatus in cui si passa un argomento di tipo ServiceControllerStatus. È possibile utilizzarlo in questo modo:

controller.WaitForStatus(ServiceControllerStatus.Running); 
+0

l'unico problema è che ti dice quando il servizio è in esecuzione, non quando il servizio si è inizializzato ed è pronto a fare ciò che vuoi. Potrebbe essere sufficiente per l'OP, potrebbe non esserlo. – gbjbaanb

+0

Non sono sicuro, ma penso che lo stato sia ServiceControllerStatus.Running quando il servizio è completamente inizializzato (dopo che il metodo OnStart è stato chiamato). Prima di ciò, è ServiceControllerStatus.StartPending. –

+2

Questo è esattamente ciò di cui avevo bisogno. Ci scusiamo per non aver notato questo metodo. A parte il fatto che ho bevuto molto caffè, stavo cercando un evento: P (il mio male). Proprio come un'aggiunta al caso: avevo bisogno di usare il metodo Refresh() per aggiornare i dati del servizio. Altrimenti l'ha mostrato come in esecuzione anche dopo Stop() (ma potrebbe essere collegato a Windows 7 che sto usando). – kyrisu

1

Utilizzare un kernel Event object. Quando avvii entrambe le app, falle creare o aprire un oggetto evento con nome, quindi attendere. L'altro può segnalarlo, capovolgendo lo stato e permettendo così all'altra di smettere di aspettare e correre.

+2

lol penso che si mis collegato che url –

+0

Si tratta di uno schermo al plasma davvero carino. :-) –

+0

hrmph. Ma io * voglio * quel plasma così tanto :) Risolto il link, evviva. – gbjbaanb

1

Probabilmente avrei generato un thead separato per semplicemente eseguire il polling e vedere quando lo stato del controller di servizio è cambiato, quando si verifica la modifica, elimina questo thread. Poi semplicemente ri deporre le uova il filo quando è necessario iniziare a ri-poll

Darknight

1

Utilizzare un EventWaitHandle. La GUI può attendere su WaitHandle e il servizio la imposterà, il che attiverà la GUI per continuare con ciò che stava facendo prima che iniziasse ad attendere. Nessun sondaggio, nessun loop, niente casino.

This great article on C# threading è probabilmente una risorsa migliore per informazioni su 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)); 
} 
Problemi correlati