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
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.
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.
Hai un riferimento per il significato del parametro temporale? Non è elencato come tale sul MSDN. –
@David: questo è stato più di un anno fa, ma lo ricordo come qualcosa che ho dedotto dai test. –
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
Il link 2 minuti in risposta di Simon Buchan si riferisce al mio Microsoft qui: http://connect.microsoft.com/VisualStudio/feedback/details/96460/servicebase-requestadditionaltime-has-no-impact-on-start-timeout
Sebbene ciò possa teoricamente rispondere alla domanda, [sarebbe preferibile] (http://meta.stackexchange.com/q/8259) includere qui le parti essenziali della risposta e fornire il link per riferimento. –
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. –
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à. –