2009-03-16 10 views
19

Ho un servizio Windows che analizza una cartella ogni n secondi per le modifiche. Sto ottenendo "il servizio non ha risposto al comando di avvio in modo tempestivo" quando si tenta di avviarlo.Servizi Windows: ciclo OnStart: devo delegare?

Ho un ciclo di partire in OnStart in questo modo:

public void OnStart(string[] args) 
{ 
    while (!_shouldExit) 
    { 
     //Do Stuff 

     //Repeat 
     Thread.Sleep(_scanIntervalMillis); 
    } 
} 

E 'questo che causa l'errore? Devo delegare questo metodo?

risposta

39

OnStart deve solo avviare il lavoro; non è responsabile di farlo. Questo in genere significa generare una nuova discussione per eseguire il lavoro effettivo. Si prevede che OnStart venga completato immediatamente. Ad esempio:

public void OnStart(string[] args) // should this be override? 
    { 
     var worker = new Thread(DoWork); 
     worker.Name = "MyWorker"; 
     worker.IsBackground = false; 
     worker.Start(); 
    } 
    void DoWork() 
    { 
     // do long-running stuff 
    } 
+0

Cosa succede al thread quando il servizio viene terminato? – JSideris

+0

@Bizorke se intendi terminato bruscamente: viene semplicemente ucciso a metà del flusso, come quando termina qualsiasi processo. Se intendi "fermato", allora: qualunque cosa il tuo codice gli dica di fare –

+0

@MarcGravell C'è uno specifico che worke.IsBackground è falso? quindi che il thread è un thread in primo piano? – Thomas

6

Il metodo OnStart non deve bloccare. È necessario generare un thread di lavoro che svolgerà il lavoro. Puoi anche dare un'occhiata alla classe FileSystemWatcher per cercare le notifiche di modifica del file system.

Problemi correlati