2011-09-16 10 views
7

Abbiamo un servizio .NET di Windows che spala un sacco di dati altamente critici da A a B in modo transazionale. Inoltre, è necessario assicurarsi che tutti i componenti esterni utilizzati nel servizio non siano allocati correttamente e che tutto venga pulito prima di arrestare il servizio stesso. Questo può richiedere ore! Il motivo è che il servizio deve attendere il callback di un componente esterno, che arriva 2, 3 o 4 ore dopo.Un servizio di Windows può richiedere ore per lo spegnimento con garbo?

  1. è possibile per Windows di aspettare così a lungo per un servizio a arresto con grazia?
  2. ci sono opzioni in un servizio in cui posso dettare cosa succede quando il servizio viene arrestato dal sistema operativo, ad es. prevenire l'arresto del tutto?
  3. anche, come un altro scenario, cosa succede se il server deve riavviare ? Può aspettare ore per il servizio?
  4. Esiste un limite per quanto tempo il sistema operativo attenderà il servizio prima di eliminarlo?
+6

hai dimenticato: 5. C'è un limite su quanto tempo una persona attenderà quella macchina per spegnere correttamente , prima di staccare la spina? –

risposta

7

È possibile utilizzare CanStop, CanShutdown, CanHandlePowerEvent per ricevere una notifica quando il computer si sta arrestando e rispondere adeguatamente.

utilizzare il metodo ServiceBase.RequestAdditionalTime di richiedere ulteriore tempo di interrompere l'discussione:

protected override void OnShutdown() 
{ 
    base.RequestAdditionalTime(MaxTimeout); 
    serviceCore.OnShutdown(); 
    Stop(); 
} 

Se l'OnShutdown() blocchi per più di 20 secondi (valore predefinito memorizzato nel registro HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ WaitToKillServiceTimeout), il servizio verrà contrassegnato come non risponde e verrà eliminato.

There is a good blog post from the BCL team on that subject that I recommend.

+2

Chiamare 'RequestAdditionalTime' in' OnShutdown' causerà un 'InvalidOperationException'. –

4

Sì, un servizio può arrestare lo spegnimento fino al completamento, ma dovrebbe? Ci sono valori di timeout nel registro per questo, qual è il sistema operativo?

Penso che sia necessario disaccoppiare il callback dall'altro componente, o bufferizzare i dati su disco e inviare in frammenti più piccoli. Cosa succede in una powercut? O se qualcuno si stanca di aspettare e si spegne?

Se i dati sono critici gestirlo fuori dalla memoria e rendere il processo riavviabile. Questo risolverà il tuo lungo processo di spegnimento. Allo stesso modo, un modo per eseguire il polling del componente per il progresso, elimina la dipendenza dal blocco.

+0

Sì, i dati sono critici in un certo senso. Questa è un'applicazione di livello enterprise in cui enormi quantità di dati vengono spostate, analizzate e indicizzate. Il problema è che il componente funziona lentamente. Ci possono essere fino a 20.000 callback che attendono di accadere in un dato momento, il che è in parte il motivo per cui ci vuole così tanto tempo. Il polling non è un'opzione in quanto la sua API non ci consente di farlo. – John

+0

Questo è incasinato, sicuramente ogni chiamata non richiede molte ore? Puoi utilizzare lotti più piccoli e distribuire le chiamate su più macchine? – TheCodeKing

0

Non è possibile utilizzare RequestAdditionalTime (MaxTimeout) all'interno OnShutdown() ...

Problemi correlati