Tengo un servicio de Windows escrito en C# que crea una carga de subprocesos y hace muchas conexiones de red (WMI, SNMP, TCP simple, http). Al intentar detener el servicio de Windows utilizando el complemento Services MSC, la llamada para detener el servicio vuelve relativamente rápido pero el proceso continúa ejecutándose durante aproximadamente 30 segundos más o menos.¿Cómo detener correctamente un servicio de Windows .NET multiproceso?
La pregunta principal es cuál podría ser el motivo por el que tarda más de 30 segundos en detenerse. ¿Qué puedo buscar y cómo puedo buscarlo?
La pregunta secundaria es por qué es el complemento msc de servicio (controlador de servicio) que vuelve aunque el proceso todavía se está ejecutando. ¿Hay alguna manera de lograr que solo regrese cuando el proceso es realmente asesinado?
Este es el código en el método OnStop del servicio
protected override void OnStop()
{
//doing some tracing
//......
//doing some minor single threaded cleanup here
//......
base.OnStop();
//doing some tracing here
}
Editar en respuesta al hilo de limpieza responde
Muchos de ustedes han respondido que debería realizar un seguimiento de todos mis hilos y luego límpialos. No creo que sea un enfoque práctico. En primer lugar, no tengo acceso a todos los hilos gestionados en una ubicación. El software es bastante grande con diferentes componentes, proyectos e incluso dlls de terceros que podrían estar creando subprocesos. No hay forma de que pueda hacer un seguimiento de todos ellos en una ubicación o tener una bandera que comprueben todos los hilos (incluso si pudiera hacer que todos los hilos revisaran una bandera, muchos hilos están bloqueando cosas como semáforos. Cuando están bloqueando pueden Verifique. Tendré que hacer que esperen con un tiempo de espera, luego verifique esta bandera global y vuelva a esperar).
La bandera de IsBackround es algo interesante de comprobar. Sin embargo, una vez más, ¿cómo puedo averiguar si tengo algún hilo forground corriendo alrededor? Tendré que verificar cada sección del código que crea un hilo. ¿Hay alguna otra manera, tal vez una herramienta que puede ayudarme a descubrir esto?
Al final, el proceso se detiene. Parecería que necesito esperar algo. Sin embargo, si espero en el método OnStop durante X cantidad de tiempo, el proceso tarda aproximadamente 30 segundos + X en detenerse. No importa lo que intento hacer, parece que el proceso necesita aproximadamente 30 segundos (no siempre son 30 segundos, puede variar) después de que OnStop regrese para que el proceso se detenga.
¿Ha puesto en nada para que los otros hilos se detienen de manera adecuada? ¿Son hilos de fondo o hilos de primer plano? –
Si está utilizando componentes que pueden crear subprocesos internamente, lo ideal es que expongan un mecanismo de apagado adecuado que pueda invocar en OnStop, para que no tenga que administrar sus subprocesos directamente. Si no es así, o si no desea preocuparse por la salida limpia y desea que el proceso finalice inmediatamente, intente llamar a Environment.Exit ... sin embargo, no estoy seguro de cómo reaccionará el SCM cuando el servicio termine mientras lo está enviando un comando de parada. – DSO