2012-06-13 15 views
11

Estoy usando un hilo en C# donde establecí la propiedad IsBackground en verdadero. El hilo ejecuta algún código en un bucle hasta que la aplicación se cierra. Cuando la aplicación se cierra, el subproceso también deja de ejecutarse (porque he configurado IsBackground = true).¿Puedo detectar cuándo un subproceso en segundo plano es eliminado por la aplicación cuando se cierra la aplicación?

¿Cómo mata la aplicación el hilo? Parece que no lo hace al llamar a abortar porque no obtengo una excepción ThreadAbortException. ¿Sucede detrás de escena? Me gustaría hacer algo de retroceso en mi bloque final del ciclo.

Sé que podría simplemente llamar a abortar en el hilo, pero quiero saber cómo la aplicación cierra mi hilo de fondo y si puedo reaccionar desde dentro del hilo. Sé que puedo suscribirme al evento Application.ApplicationExit, pero estoy ejecutando este código tanto en un servicio como en un winform y preferiría capturar una excepción dentro del ciclo, así puedo revertir en la declaración finally.

+0

Puede hacer que sea un hilo de primer plano y crear un escenario de cierre de aplicación 'global' que cierre manualmente el hilo. – CodingBarfield

+0

¿Ha mirado el evento [AppDomain.ProcessExit] (http://msdn.microsoft.com/en-us/library/system.appdomain.processexit.aspx)? – Botz3000

+0

¿Entonces ambos dicen que sucede detrás de escena y que no puedo reaccionar sino crear este tipo de soluciones personalizadas? –

Respuesta

5

Parece que no lo hace llamando a abortar porque no consigo un ThreadAbortException

lo hace, el CLR tiene dos formas de abortar un hilo. La forma "normal", invocada a través de Thread.Abort(), el hilo puede ver una ThreadAbortException. Pero también hay un aborto grosero, funciona de la misma manera. Pero menos el TAE y no finalmente los bloques se ejecutan. No puedes observarlo

+0

Aha .. Gracias por solucionar eso. No pude encontrar ninguna documentación en este –

+0

¿Es un error en MSDN? http://msdn.microsoft.com/en-us/library/system.threading.threadabortexception.aspx Cuando el tiempo de ejecución de lenguaje común (CLR) detiene los subprocesos de fondo después de que han finalizado todos los subprocesos de primer plano en un ejecutable administrado, no utiliza Thread.Abort. Por lo tanto, no puede usar ThreadAbortException para detectar cuando el CLR finaliza los hilos de fondo. – Eldar

+0

No veo ninguna discrepancia entre ese artículo de MSDN y esta respuesta. El código de la aplicación puede desencadenar abortos groseros, pero necesitaría AppDomain.Unload o Environment.Exit, generalmente no es el tipo de métodos que alguien piensa primero como una forma de abortar un hilo :) –

1

El Started thread entra en el estado En ejecución (es decir, comienza a ejecutarse) cuando el sistema operativo asigna un procesador al thread. Cuando un hilo Iniciado recibe un procesador por primera vez y se convierte en un hilo en ejecución, el hilo ejecuta su ThreadStart delegate, que especifica las acciones que el hilo ejecutará durante su ciclo de vida. Cuando un programa crea un nuevo subproceso, el programa especifica el ThreadStart delegate del subproceso como el argumento para el constructor del subproceso.

Un hilo en ejecución entra en el estado Stopped (or Dead) cuando termina ThreadStart delegate. En tu caso, tu hilo principal termina. Por lo tanto, su objeto ThreadStart delegate no permanece en la memoria. Cuando no hay referencias al objeto de subproceso, el recolector de elementos no utilizados puede eliminar el objeto de subproceso de la memoria.

+0

Gracias por una buena explicación de esto. Terminé usando el evento AppDomain.ProcessExit como se sugirió Botz3000. Entonces puedo llamar a thread.Abort() cuando se produce este evento. Parece que funciona bien. –

+0

Esta respuesta es incorrecta. Un hilo de fondo abandonado no se cancela cuando el GC lo recoge. El tiempo de ejecución lo aborta por completo, independientemente de las fuertes referencias que tenga al objeto de subproceso administrado. Vea la respuesta de Hans para la explicación. – Josh

+0

@JoshEinstein: Puede que tengas razón, pero Hans no explicó cómo CLR abortaba el hilo de manera anormal ... ¿Puedes explicarlo? – Talha

Cuestiones relacionadas