2010-01-05 7 views
5

Ho un problema che non riesco a capire per quanto riguarda un servizio di Windows che ho scritto in C#. Quello che sto cercando di fare è aspettare un periodo specificato affinché un processo figlio termini prima che io sia costretto a ucciderlo e interrompere il servizio. Ho impostato il timeout da 5 a 15 secondi e il mio servizio attende il tempo appropriato, quindi uccide il bambino e si ferma quando lo interrompono tramite la finestra del servizio mmc. Tuttavia, se spengo il computer, il mio servizio viene spazzato via prima che sia in grado di attendere e fermarsi correttamente. Ho letto che Windows consente un timeout di 30 secondi prima che un servizio venga arrestato prima che venga scaricato. Il mio codice è in esecuzione in molto meno tempo di 30 secondi, il massimo è di circa 20 secondi o giù di lì, a seconda di cosa ho impostato il timeout a.Forzare Windows per attendere che un servizio si interrompa quando si sta arrestando

Ho provato a utilizzare la funzione SetServiceStatus() nell'API win32 ma non ha modificato la funzione del codice. Ho verificato che la chiamata alla funzione ha esito positivo. C'è un altro modo per forzare Windows ad aspettare che il mio servizio si arresti correttamente? Lo sto testando su Windows 7 x86 e Windows Vista Sp1 x86.

risposta

2

Windows fa non lasciare che qualsiasi servizio impedisca l'arresto, questo è by-design. come dice Gyuri, devi considerare un design diverso per la tua app.

+0

+1: * Ovviamente * la soluzione qui richiede che il servizio impieghi meno tempo per fermarsi. Molte applicazioni ignorano l'importanza di questo e di. –

0

OnSTart e OnSTop sono ereditati da una classe base che fa un bel po 'per voi. Tutte le implementazioni di questi metodi dovrebbero essere avviate o arrestate il codice cliente, Windows farà il resto.

Lo proverò con il fatto che io uso C# e l'implementazione di .Net di ServiceBase fa questo, non posso parlare in modo autorevole del codice C/C++ o delle API.

1

Questa è un'impostazione globale di Windows, apparentemente: http://support.microsoft.com/kb/305788. Sarei preoccupato se dovessi fare affidamento sugli utenti per far chiudere il mio servizio. Vorrei invece salvare periodicamente i miei dati.

+0

Questo fa schifo. Ho un servizio Windows che ospita macchine virtuali che richiedono tempo per spegnersi. Non voglio che sia indefesso, ma un timeout più lungo (poco più di un minuto) garantisce che le mie macchine siano correttamente spente. – Jens

Problemi correlati