c# - w3org - w3c etiquetas html
¿Cuál es la diferencia entre Environment.Exit() y Application.Shutdown()? (3)
- NUNCA debes llamar a TerminateThread
- Asegúrese de que todos los subprocesos que genera estén marcados como fondo, de esta manera, cuando cierre la aplicación, no esperará a que se completen.
A veces la aplicación no puede salir cuando llamé a Application.Shutdown , la interfaz de usuario se cerró, pero el proceso aún se está ejecutando. ¿Cómo cerrar la aplicación con cerrar todos los hilos? ¿El Environment.Exit () podría cerrar todos los hilos? ¿O deberíamos llamar a Win32 API TerminateThread para hacerlo?
Como dijo Shay, NUNCA llame a TerminateThread, TerminateThread mata solo un hilo sin dejar que se limpie después de esto, esto puede llevar a puntos muertos y corrupciones en otros hilos en el proceso.
TerminateProcess en el otro lado acabará con todo el proceso y permitirá que el sistema operativo se limpie, es la forma más rápida de cerrar un proceso; solo tiene que asegurarse de no tener ningún recurso que el sistema operativo no pueda limpiar (también ayuda a cerrar ventanas antes de llamar a TerminateProcess).
Creo, pero no he comprobado, que Environemnt.Exit llama a TerminateProcess.
Application.Shutdown es muy diferente, no detiene el proceso de inmediato: envía todas las notificaciones de cierre y apagado y espera a que todas las ventanas y los hilos de la aplicación se cierren solos.
Environment.Exit es una forma más brutal de cerrar su aplicación, sí, pero en general, si necesita que cierre su aplicación para cerrarla, creo que está viendo el problema de manera incorrecta. Deberías ver por qué los otros hilos no se cierran correctamente.
Puede ver el evento FormClosing en el formulario principal y cerrar los recursos que cuelgan la aplicación y evitar que se cierre.
Así es como he encontrado recursos colgando la aplicación.
- En el modo de depuración, habilite la visualización de threads (Esto le permitirá ver todos los subprocesos que ejecuta su aplicación)
- Cierre la aplicación de forma que no se cierre correctamente.
- Pulse pausar en en estudio visual
- Mire la lista de hilos y haga clic en ellos para ver dónde está colgado el código, ahora que puede ver qué recursos están bloqueando el cierre de su aplicación, vaya a su evento FormClosing y ciérrelos / deséchelos allí.
- Repita hasta que la aplicación se cierre correctamente :)
Tenga en cuenta que la lista de subprocesos en el modo de depuración mostrará algunos subprocesos que se ejecutan pero no están bajo su control, estos subprocesos raramente tienen un nombre y al hacer clic en ellos aparece un mensaje que indica que no tiene símbolos. Estos pueden ser ignorados con seguridad
Una de las razones para asegurarse de que su aplicación se está cerrando correctamente es que si algunos recursos (digamos un FileStream ) no se hacen funcionar, por lo que usar un api para forzarlo a la velocidad puede hacer que surjan todo tipo de problemas "aleatorios", como Configuración / archivos de datos no se están escribiendo y así sucesivamente.