2012-07-26 16 views
5

Supongo que todas las ejecuciones cesan inmediatamente y el extremo que llama obtiene un tiempo de espera. ¿Qué sucede exactamente cuando detiene un servicio y cuánto control tiene sobre él?¿Qué sucede si detengo mi servicio de Windows mientras procesa una solicitud de WCF?

+1

¿Qué servicio de Windows? ¿Es algo que escribiste? Esto depende completamente de cómo el servicio maneje la solicitud de cierre. Podría escribirse para completar su trabajo actual o no. – James

+0

¿Has probado esto tú mismo? ¿Cuál fue el resultado? – Bernard

+1

Escribiría la respuesta correcta ... pero amigo ... PRUEBE usted mismo! Solo lleva unos segundos probarlo usted mismo. – Eiver

Respuesta

4

Cuando el Administrador de control de servicios le dice a su servicio que se detenga, .Net ServiceBase establece el estado en SERVICE_STOP_PENDING y llama al método OnStop de su servicio. Lo que hagas con esa notificación depende de ti. Idealmente, tendrá algún mecanismo, como el uso de un CancellationToken, para notificar a cualquiera de sus hilos que actualmente funcionan que deben cerrarlo y salir lo más rápido posible. En su caso, puede implicar el cierre de su ServiceHost. Su método OnStop debe esperar hasta que sepa que se ha logrado (al unirse a los hilos, por ejemplo) antes de volver. Hay formas de notificar al Administrador de control de servicios que necesita más tiempo, o simplemente para informarle que recibió la notificación y que está trabajando activamente para detenerlo (SERVICE_STATUS dwcheckpoint).

Si acaba de regresar inmediatamente de su OnStop (o no se moleste en implementarlo), entonces creo que los hilos de su servicio serán terminados a la fuerza rápidamente. No lo sé con certeza, porque nunca lo intenté. Siempre implemento OnStop, y solo regreso cuando todo está limpio. Si implementa OnStop, pero tarda mucho tiempo en regresar sin que el administrador de control de servicios sepa que está trabajando en ello, esperará un poco (20 segundos para detener el servicio ... es una configuración de registro), y luego termina tus hilos.

Lo correcto es escribir su servicio para que comience rápidamente, se detenga rápidamente, se pause y continúe rápidamente, etc. Como puede ver en la descripción anterior, exactamente lo que sucede en su caso, depende completamente de cómo su servicio fue implementado. Solo usted tiene la información para "saber con certeza".

http://blogs.msdn.com/b/bclteam/archive/2009/02/19/in-depth-how-net-managed-services-interact-with-the-servicecontrolmanager-scm-kim-hamilton.aspx

Cuestiones relacionadas