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. –
- 1. Kotlin: il riferimento al metodo non funziona?
- 2. Il riavvio/aggiornamento di Unicorn non funziona
- 3. Android: perché il metodo onClick non funziona?
- 4. perché il metodo sincronizzato non funziona per il multithread
- 5. Perché il metodo array() di MappedByteBuffer non funziona?
- 6. Servizio Windows non automatico Avvio al riavvio
- 7. AppWidget PendingIntent non funziona dopo il riavvio di Launcher
- 8. Perché non è il metodo toLowerCase(); funziona nel mio codice?
- 9. al momento non sono installate dopo il riavvio
- 10. Perché il trim non funziona?
- 11. Le impostazioni di RabbitMQ scompaiono al riavvio. Perché?
- 12. Perché "block_given?" Non funziona in questo metodo definito dinamicamente?
- 13. LINQ Except() Il metodo non funziona
- 14. Il metodo Click() non funziona sempre
- 15. Perché il confronto non funziona in CONVERT?
- 16. Perché il riciclaggio non funziona?
- 17. Il metodo di override uguali non funziona
- 18. perché il semaforo non funziona?
- 19. Che cos'è un sovraccarico sicuro per RequestAdditionalTime()?
- 20. Il metodo XMLHttpRequest del metodo javascriptHeader dell'oggetto javascript non funziona
- 21. Perché il mio ActionLink non funziona?
- 22. Perché setWidth non funziona?
- 23. Mockito quando il metodo non funziona
- 24. Perché il metodo "geometry()" funziona con un ritardo?
- 25. Sostituisci metodo non funziona
- 26. php.ini reset al riavvio del server MAMP
- 27. Perché Java non mi consente di accedere al metodo privato tramite il metodo della stessa classe?
- 28. Il metodo IOAcknowledge NON funziona per SocketIO in Android?
- 29. Perché String.replace non funziona?
- 30. Perché view.bringToFront() non funziona?
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à. –