2013-02-01 17 views
6

Sto guardando un codice legacy sotto forma di un servizio di Windows.Devo implementare il metodo Stop in un servizio Windows?

Ho notato che nel loro metodo OnStop(), scrivono semplicemente nel registro eventi, tuttavia non vi è alcun ripulitura dell'oggetto o controllo di terminare alcun thread. Ci sono 2 thread in background avviati all'avvio del servizio, quindi mi chiedo, questo servizio si ferma effettivamente? E se lo fa, i fili si chiudono correttamente?

Il metodo di arresto termina fisicamente il processo o è solo un arresto logico, che se non viene implementato non fa effettivamente nulla?

risposta

0

Per rispondere alla prima domanda Termina il processo. Ma deve implementare il codice di ripulitura perché uno scenario comune ti lascerà il thread in esecuzione sul servizio e verrà arrestato ma il processo sarà ancora lì a causa del thread. Ho avuto la stessa esperienza con il thread sinistro, quindi dovremmo implementare il codice di pulizia del thread e altre risorse che possono impedire la chiusura del processo.

+0

Ho appena testato (vedi il codice nella mia risposta), ha terminato il servizio senza problemi quando avevo un thread in esecuzione. L'unica volta in cui ho avuto problemi con l'arresto è se si eseguiva un'operazione in "OnStop" che richiedeva molto tempo per essere completata. –

+0

Cosa è successo al tuo post scott? – jaffa

+0

Ho verificato nuovamente il codice. Il servizio verrà arrestato ma il processo continuerà a essere in esecuzione. si prega di interrompere il servizio e controllare in Task Manager vedrete il processo esiste –

1

Il metodo OnStop() viene chiamato quando il servizio viene arrestato è possibile cancellare gli oggetti e interrompere i thread ecc. Qui. Se il thread non ha bisogno di qualcosa di speciale da fare quando il servizio è interrotto, è possibile lasciare il metodo OnStop

OnStop deve essere sovrascritto nella classe derivata. Per il servizio per essere utile, OnStart e OnStop dovrebbero entrambi essere implementate in vostra classe di servizio, msdn

+0

Cosa succede se il thread ha una chiamata di blocco come un TcpListener in ascolto per i client? – jaffa

+0

OnStop chiamerà su thread differenti come il thread TcpListener può bloccarlo? – Adil

+0

Quindi OnStop interromperà il thread padre e i thread figlio indipendentemente dal fatto che il thread secondario stia bloccando? – jaffa

1

arresto di un servizio non è la stessa cosa di terminarlo. È una condizione logica logica. L'amministratore avrà l'aspettativa che smetterai di fare qualsiasi cosa tu faccia dopo l'avvio del servizio. Quindi il tuo servizio non interferisce con quello che farà dopo. Dì il backup di una directory o la modifica di un file di configurazione, ecc.

per implementare effettivamente questo. Windows non lo applica, il gestore del servizio ti prende in parola quando segnala di esserti fermato e non ti impedisce in altro modo di fare nulla. Ma certo a rischio di confondere l'amministratore.

Problemi correlati