¿Cómo salir correctamente de una aplicación C #?

Tengo una aplicación publicada en C #. El problema aquí es que cada vez que cierro el formulario principal al hacer clic en el botón rojo de salida, cierra el formulario pero no cierra la aplicación. Descubrí esto cuando traté de apagar la computadora, con la esperanza de que la aplicación que hice funcionara sin problemas y luego me bombardearon muchas ventanas secundarias con las que coloqué MessageBox Alerts.

Intenté Application.Exit pero todavía llama a todas las ventanas y alertas secundarias y no sé cómo usar Environment.Exit y qué entero poner en él. Por cierto, cada vez que mis formularios llaman al formulario cerrado o al cierre de formulario cierro la aplicación con una función this.Hide() . ¿Eso afecta cómo se está comportando mi aplicación ahora?

Desde MSDN:

Solicitud.Salida

Informa a todas las bombas de mensajes que deben terminar, y luego cierra todas las ventanas de la aplicación después de que los mensajes hayan sido procesados. Este es el código que debe usar si ha llamado a Application.Run (aplicaciones WinForms), este método detiene todos los bucles de mensajes en ejecución en todos los hilos y cierra todas las ventanas de la aplicación.

Environment.Exit

Termina este proceso y le da al sistema operativo subyacente el código de salida especificado. Este es el código para llamar cuando está usando una aplicación de consola.

Este artículo, Application.Exit vs. Environment.Exit , apunta hacia un buen consejo:

Puede determinar si se ha llamado a System.Windows.Forms.Application.MessageLoop al marcar la propiedad System.Windows.Forms.Application.MessageLoop . Si es verdadero, se ha llamado a Run y ​​puede suponer que una aplicación WinForms se está ejecutando de la siguiente manera.

 if (System.Windows.Forms.Application.MessageLoop) { // WinForms app System.Windows.Forms.Application.Exit(); } else { // Console app System.Environment.Exit(1); } 

Referencia: ¿Por qué no funcionaría Application.Exit?

Sé que este no es el problema que tenías, sin embargo, otra razón por la que esto podría suceder es que tienes un hilo que no sea de fondo abierto en tu aplicación.

 using System; using System.Threading; using System.Windows.Forms; namespace Sandbox_Form { static class Program { private static Thread thread; [STAThread] static void Main() { Application.EnableVisualStyles(); Application.SetCompatibleTextRenderingDefault(false); thread = new Thread(BusyWorkThread); thread.IsBackground = false; thread.Start(); Application.Run(new Form()); } public static void BusyWorkThread() { while (true) { Thread.Sleep(1000); } } } } 

Cuando IsBackground es false , mantendrá su progtwig abierto hasta que se complete el hilo, si establece IsBackground en true el hilo no mantendrá el progtwig abierto. Cosas como BackgroundWoker , ThreadPool y Task usan internamente un hilo con IsBackground establecido en true .

Todo lo que necesita es System.Environment.Exit(1);

Y usa el espacio de nombres del sistema “using System” que casi siempre está allí cuando comienzas un proyecto.

Por cierto. cada vez que mis formularios llaman al formulario cerrado o al evento de cierre de formulario cierro la aplicación con una función this.Hide (). ¿Eso afecta cómo se está comportando mi aplicación ahora?

En resumen, sí. La aplicación completa finalizará cuando el formulario principal (el formulario iniciado a través de Application.Run en el método Main ) esté cerrado (no oculto).

Si toda su aplicación siempre debe finalizar por completo cada vez que se cierre su formulario principal, simplemente debe eliminar ese formulario manejador cerrado. Al no cancelar ese evento y simplemente dejar que se formen cerca cuando el usuario lo cierra, obtendrá el comportamiento deseado. En cuanto a todos los demás formularios, si no tiene la intención de volver a mostrar la misma instancia del formulario, simplemente deje que se cierren, en lugar de evitar el cierre y ocultarlos. Si los muestra de nuevo, esconderlos puede estar bien.

Si desea que el usuario haga clic en la “x” para su formulario principal, pero tenga otro formulario abierto y, en efecto, se convierta en el formulario principal “nuevo”, entonces es un poco más complicado. En tal caso, deberá ocultar su formulario principal en lugar de cerrarlo, pero deberá agregar algún tipo de mecanismo que realmente cierre el formulario principal cuando realmente desee que finalice su aplicación. Si esta es la situación en la que se encuentra, necesitará agregar más detalles a su pregunta que describa qué tipos de aplicaciones deberían y no deberían finalizar el progtwig.

¿Lo haces?

 Application.Run(myForm); 

en tu Main ()?

Encontré una manera muy fácil de matar la aplicación cuando se cierra el formulario.

Yo cualquiera de los siguientes:

Application.Exit ();

para un winform o

Environment.Exit (0);

para una aplicación de consola (también funciona en winforms).

¡Gracias!

 Environment.Exit(exitCode); //exit code 0 is a proper exit and 1 is an error 

En este caso, la forma más adecuada de salir de la aplicación para anular el métodoExit () en App.xaml.cs:

 protected override void OnExit(ExitEventArgs e) { base.OnExit(e); }