2009-05-25 18 views

Respuesta

17

Environment.Exit() es una forma más brutal de cerrar su aplicación, sí, pero en general si necesita matar su aplicación para cerrarla, entonces creo que está mirando el problema de la manera incorrecta. Deberías mirar más bien por qué los otros hilos no se cierran con gracia.

Puede consultar el formulario FormClosing event en el formulario principal y cerrar todos los recursos que estén colgando la aplicación evitando que se cierre.

Así es como he encontrado recursos para colgar la aplicación.

  1. En el modo de depuración permiten proyección de threads (Esto le permitirá ver todos los hilos que se ejecuta la aplicación)
  2. cerrar la aplicación en la forma en que no se cierra correctamente.
  3. Presione pausa en Visual Studio
  4. Mire la lista de hilos y haga clic en ellos para ver dónde están colgando el código, ahora que puede ver qué recursos bloquean el cierre de su aplicación vaya a su evento FormClosing y cerrar/desecharlos allí.
  5. Repita hasta que la aplicación se cierra correctamente :)

Tenga en cuenta que la lista de temas en el modo de depuración mostrará algunos hilos que se ejecutan pero no bajo su control, estos hilos rarly tienen un nombre y cuando se hace clic en les aparece un mensaje que dice que no tienes símbolos. Estos pueden ser ignorados de forma segura

Una de las razones para asegurarse de que su aplicación se cierra correctamente es que si algunos recursos (digamos un FileStream) no funciona, use una API para forzarlo a hacer todo tipo de cosas rápidamente. de problemas "aleatorios", como configuraciones/archivos de datos que no se escriben, etc.

+0

gracias por su respuesta, llamada 'Application.Shutdown', pero el proceso todavía se está ejecutando no siempre sucedió, he intentado encontrar el hilo que se estaba ejecutando, pero este error no se volvió a producir ... –

8
  1. Debe NUNCA llamada TerminateThread
  2. Asegúrese de que todos los hilos que son desovar marca como fondo, de esta manera cuando se cierra la aplicación no va a esperar a que se completen.
+0

Oh, increíble. No sabía que podrías hacer # 2. – Joel

+1

IsBackground resolvió este problema para mí. Muy útil, sorprende que no sea más ampliamente conocido. – SouthShoreAK

1

Como dijo Shay, NUNCA se llama TerminateThread, TerminateThread elimina solo un hilo sin dejarlo limpiar por sí mismo, lo que puede llevar a bloqueos y daños en otros hilos en el proceso.

TerminateProcess en el otro habría matado todo el proceso y dejaría que el sistema operativo se limpiara, es la forma más rápida de cerrar un proceso; solo tiene que asegurarse de no tener recursos que el SO no pueda limpiar (también ayuda a cerrar ventanas antes de llamar a TerminateProcess).

Creo, pero no lo he comprobado, que Environemnt.Exit llama a TerminateProcess.

Application.Shutdown es muy diferente, no elimina el proceso de inmediato, envía todas las notificaciones de cierre y apagado y espera a que todas las ventanas y subprocesos de la aplicación se cierren.

Cuestiones relacionadas