¿Cuál es la diferencia entre Environment.Exit () y Application.Shutdown ()?

A veces, la aplicación no puede salir cuando llamé a Application.Shutdown , la UI se cerró, pero el proceso aún se está ejecutando. ¿Cómo cerrar la aplicación con cerrar todos los hilos? ¿ Environment.Exit () podría cerrar todo el hilo? o deberíamos llamar a la API de Win32 TerminateThread para hacerlo?

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

Puede examinar el evento FormClosing en el formulario principal y cerrar los recursos que cuelgan de la aplicación y evitar que se cierre.

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

  1. En el modo de depuración, habilite la visualización de subprocesos (Esto le permitirá ver todos los subprocesos que ejecuta su aplicación)
  2. Cierre la aplicación de forma que no se cierre 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 están bloqueando el cierre de su aplicación, vaya a su evento de Cierre de formularios y ciérrelos / Deséchelos allí.
  5. Repita hasta que la aplicación se cierre correctamente 🙂

Tenga en cuenta que la lista de hilos en el modo de depuración mostrará algunos hilos que se ejecutan pero que no están bajo su control, estos hilos raramente tienen un nombre y cuando hace clic en ellos, aparece un mensaje que dice que no tiene 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 funcionan, usar una API para forzarlo rápidamente puede hacer que surjan todo tipo de problemas “aleatorios”, como configuración / archivos de datos no escritos, etc.

  1. NUNCA debes llamar a TerminateThread
  2. Asegúrese de que todos los hilos que genere estén marcados como fondo, de esta forma, cuando cierre la aplicación, no esperará a que se completen.

Como dijo Shay, NUNCA llame a TerminateThread, TerminateThread mata solo un hilo sin dejar que se solucione por sí mismo, lo que puede llevar a lockings y corrupciones en otros hilos del proceso.

TerminateProcess ha matado a todo el proceso y permite que el sistema operativo lo limpie, es la manera más rápida de cerrar un proceso; solo tiene que asegurarse de no tener recursos que el SO no pueda eliminar (también ayuda a cierre las ventanas antes de llamar a TerminateProcess).

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

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