2010-05-08 10 views
7

tengo un servicio de Windows escrito en .NET 3.5 (C#) con un System.Threading.Timer que genera varios hilos en cada devolución de llamada. Estos son solo hilos normales (sin conjunto de hilos) y establecí el IsBackground = true en cada hilo, ya que solo voy a ejecutar el código administrado.El cierre de un servicio de Windows que tiene roscas

Cuando un usuario se detiene el servicio, lo que ocurre con todos los hilos? ¿Mueren con gracia? No tengo ningún código que administre los subprocesos a través de invocación join o abortar. ¿Es correcto suponer que IsBackground = true es suficiente para asumir que los hilos serán eliminados y detenidos cuando un usuario detiene el servicio? ¿Qué ocurre exactamente cuando alguien detiene un servicio de Windows a través de la GUI de Service Manager? ¿Mata el proceso después de que se activa el evento OnStop?

realidad, esto sería aceptable para mí, porque yo he construido un mecanismo separado que permite al usuario saber con certeza que no hay hilos antes de que dejen el servicio. Esto se hace a través de 2 métodos WCF expuestos desde un ServiceHost que se ejecuta dentro del Servicio de Windows. Hay un método para detener el engendramiento de nuevos hilos y otro método para consultar cuántos subprocesos en ejecución quedan.

Tengo curiosidad de lo que sucede si se saltan los pasos y sólo dejan el servicio ... Parece que la IsBackground ayuda a lograr este objetivo:

Respuesta

6

Desde el enlace de MSDN que ya ha proporcionado:

Un el hilo es un hilo de fondo o un hilo de primer plano. Los subprocesos de fondo son idénticos a los subprocesos de primer plano, excepto que los subprocesos de fondo no impiden que un proceso finalice. Una vez que todos los hilos de primer plano que pertenecen a un proceso han terminado, el tiempo de ejecución de lenguaje común finaliza el proceso. Cualquier cadena de fondo restante se detiene y no se completa.

Configuración de la propiedad de un hilo IsBackground a true le permitirá a su servicio de Windows para terminar inmediatamente una vez que la devolución de llamada OnStop() ha terminado la ejecución de todas las discusiones y en primer plano (si los hay) han salido. Los subprocesos de fondo se detendrán donde estén en su estado de ejecución, por lo que si estos subprocesos tienen que terminar con elegancia, deberá usar un mecanismo diferente.

Una forma de hacer esto sería el uso de hilos de primer plano que verifican un objeto ManualResetEvent que las señales de los hilos del apagado. En su OnStop() de devolución de llamada, establecer la ManualResetEvent y luego esperar a que los hilos para salir usando Join(). Si no salen en un tiempo razonable, puede terminarlos por la fuerza ya que el proceso se está cerrando.

+0

Gracias, esto funciona muy bien! – ECC

Cuestiones relacionadas