2011-09-16 7 views
7

Tenemos un servicio .NET Windows que almacena una gran cantidad de datos altamente críticos de A a B de forma transaccional. También debemos asegurarnos de que todos los componentes externos usados ​​en el servicio no se hayan asignado correctamente y que todo haya sido limpiado antes de cerrar el servicio. ¡Esto puede llevar horas! La razón de esto es que el servicio necesita esperar la devolución de llamada de un componente externo, que llega 2, 3 o 4 horas después.¿Puede un servicio de Windows tardar horas en apagarse correctamente?

  1. es posible para Windows que esperar mucho tiempo para un servicio a se cierren correctamente?
  2. hay opciones en un servicio en el que puedo dictar lo que sucede cuando el sistema operativo está cerrando el servicio, p. prevenir el cierre por completo?
  3. también, como otro escenario, ¿qué ocurre si el servidor necesita reiniciar ? ¿Puede esperar horas para el servicio?
  4. ¿Existe un límite en cuanto a cuánto tiempo esperará el sistema operativo en el servicio antes de matarlo?
+6

se olvidó: 5. ¿Hay un límite de cuánto tiempo una persona va a esperar a que la máquina se apague correctamente antes de simplemente desconectar? –

Respuesta

7

Puede usar CanStop, CanShutdown, CanHandlePowerEvent para recibir una notificación cuando la computadora se apaga y responde adecuadamente.

utilizar el método de ServiceBase.RequestAdditionalTime a solicitar un tiempo adicional de interrumpir el hilo:

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

Si su OnShutdown() bloques de más de 20 segundos (valor predeterminado almacenado en el registro HKEY_LOCAL_MACHINE \ SYSTEM \ CurrentControlSet \ Control \ WaitToKillServiceTimeout), su servicio se marcará como no responde y se eliminará.

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

+2

Llamar 'RequestAdditionalTime' dentro de' OnShutdown' causará una 'InvalidOperationException'. –

4

Sí un servicio puede detener el cierre hasta que se complete, pero ¿debería? Hay valores de tiempo de espera en el registro para esto, ¿cuál es el sistema operativo?

Creo que necesita desacoplar la devolución de llamada del otro componente, o almacenar datos en el disco y enviar fragmentos más pequeños. ¿Qué sucede en un corte de energía? ¿O si alguien se harta de esperar y se desconecta?

Si los datos son críticos, adminístrelos fuera de la memoria y haga que el proceso se reinicie. Esto resolverá su largo proceso de apagado. Del mismo modo, una forma de sondear el componente para el progreso, elimina la dependencia del bloqueo.

+0

Sí, los datos son críticos en cierto sentido. Esta es una aplicación de nivel empresarial donde se mueven, analizan e indexan grandes cantidades de datos. El problema es que el componente funciona lentamente. Puede haber hasta 20,000 devoluciones de llamadas esperando que ocurra en un momento dado, que es en parte por lo que demora tanto. El sondeo no es una opción, ya que su API no nos permite hacerlo. – John

+0

Eso está mal, seguramente cada llamada no toma varias horas? ¿Puedes usar lotes más pequeños y distribuir llamadas entre múltiples máquinas? – TheCodeKing

0

No se puede utilizar RequestAdditionalTime (MaxTimeout) en el interior OnShutdown() ...

Cuestiones relacionadas