2010-01-06 7 views
7

Ho eseguito alcuni test approfonditi su un servizio Windows che ho scritto in C# .Net 3.5. Sto riscontrando problemi nel far sì che Windows mi dia il tempo sufficiente perché il mio servizio si spenga correttamente quando riavvio o chiudo il computer, anche se sto invocando il metodo RequestAdditionalTime() che dovrebbe aggiornare SCM e mantenere attivo il mio servizio. Il mio codice funziona correttamente se tuttavia interrompo manualmente il servizio. Ho provato principalmente questo codice in Windows Vista e Windows 7, dopo aver deciso di testare il codice in Windows Xp, tutto ha funzionato perfettamente. Qualcuno sa perché questa chiamata non funziona in Vista/7? Sto pensando che ho bisogno di un qualche tipo di permesso per impedire al sistema di spegnersi che ottengo per impostazione predefinita in Xp ma non in Vista/7.Perché il metodo RequestAdditionalTime() non funziona al riavvio in Vista/7?

risposta

6

Se il sistema non si sta arrestando, il servizio può richiedere ulteriore tempo e il processo non verrà ucciso.

Se il sistema si sta arrestando, il servizio deve essere chiuso. Non si ottengono nemmeno i normali 30 secondi che normalmente un servizio ottiene. L'arresto è più forte di un tempo.

+2

C'è un modo per conoscere la quantità di tempo il servizio otterrà per spegnere quando si spegnere o riavviare il computer? So che WaitToKillServiceTimeout è impostato su 12000 in W7 e 20000 in Vista, Xp. Ma anche quando cambi questo valore in W7 o Vista ha un effetto scarso o nullo. Soprattutto in Windows 7, il tuo servizio viene bloccato in pochi secondi. Grazie per l'intuizione. –

+0

Penso che non ci sia modo di sapere. Supponiamo che Windows consenta 13 secondi per l'arresto di tutti i servizi. Alcuni altri servizi impiegano 12 secondi di tempo CPU (quindi altri servizi non possono essere eseguiti in quel momento) e infine si spengono. Questo lascia 1 secondo per tutto il resto. Windows li ucciderà. –

2

Nel caso non l'arresto, RequestAdditionalTime() deve essere richiamato più spesso di quanto ogni 2 minuti:

protected override void OnStop() 
    { 
     Thread.Sleep(60000); 
     RequestAdditionalTime(180000); 
     Thread.Sleep(60000); 
     RequestAdditionalTime(180000); 
     Thread.Sleep(5000); 
    } 

nota che, nonostante il nome, il parametro di tempo è il tempo di arresto totale richiesto.

+0

Hai un riferimento per il significato del parametro temporale? Non è elencato come tale sul MSDN. –

+1

@David: questo è stato più di un anno fa, ma lo ricordo come qualcosa che ho dedotto dai test. –

+0

Questo non funziona in Windows 7 (tuttavia è configurato qui). Inoltre, l'esempio non illustra chiaramente più tempo in quanto il valore predefinito è 120 secondi (qui) e vengono mostrati solo ~ 125 secondi di sonno. – user2864740

Problemi correlati