c# - tutorial - windows forms visual studio 2017
¿Por qué no funcionaría Application.Exit? (8)
Tengo una aplicación que ha estado recibiendo errores extraños al cancelar desde un cuadro de diálogo. La aplicación no puede continuar si se cancela el cuadro, por lo que se cierra, pero no funciona por alguna razón, y por lo tanto, sigue ejecutándose y se bloquea.
Depuré este problema, y de alguna manera la aplicación se ejecuta justo después de la llamada Application.Exit. Me estoy ejecutando en modo Depuración, y esto es relevante debido a una pequeña cantidad de código que depende de la variable LIBERACIÓN que se está definiendo. Aquí está el código de salida de mi aplicación. He rastreado el código y entró en el método ExitApp, y continúa, devolviendo el control a la persona que llama y finalmente se bloquea.
Esta es una aplicación que proporciona informes a través de una conexión de escritorio remoto, por eso el código de salida es un poco extraño. Trata de finalizar la sesión remota, pero solo cuando se ejecuta en versión de lanzamiento porque no quiero apagar mi máquina de desarrollo para cada ejecución de prueba.
private void ExitApp()
{
HardTerminalExit();
Application.Exit();
}
// When in Debug mode running on a development computer, this will not run to avoid shutting down the dev computer
// When in release mode the Remote Connection or other computer this is run on will be shut down.
[Conditional("RELEASE")]
private void HardTerminalExit()
{
WTSLogoffSession(WTS_CURRENT_SERVER_HANDLE, WTS_CURRENT_SESSION, false);
}
He ejecutado un depurador justo después de la línea Application.Exit y no ocurre nada, luego el control vuelve a la persona que llama después de que paso por esa línea.
¿Que esta pasando? Esta es una aplicación de Windows Forms.
Asegúrese de no tener Console.ReadLine (); en su aplicación y Environment.Exit (1); funcionará y cerrará tu aplicación.
¿Se ejecuta esta aplicación (en el método Main
) usando Application.Run()
? De lo contrario, Application.Exit()
no funcionará.
Si escribió su propio método Main
y desea detener la aplicación, solo puede detener volviendo desde el método Main
(o eliminando el proceso).
Pruebe Environment.Exit(exitCode)
.
Además, asegúrese de que los subprocesos que se ejecutan en su aplicación tengan la propiedad IsBackground establecida en verdadera. Los hilos que no son de fondo bloquearán fácilmente la salida de la aplicación.
He pasado por esta situación en muchos casos uso Thread.CurrentThread.Abort ()
y el proceso está cerrado. Parece que Application.Exit no se conecta correctamente con el hilo actual.
Habiendo tenido este problema recientemente (que Application.Exit no terminaba correctamente las bombas de mensajes para win-forms con Application.Run (new Form ()), descubrí que si está generando nuevos hilos o iniciando background workers en el constructor, esto evitará que Application.Exit se ejecute.
Mueva todas las llamadas ''RunWorkerAsync'' desde el constructor a un método Load de formulario:
public Form()
{
this.Worker.RunWorkerAsync();
}
Mover a:
public void Form_Load(object sender, EventArgs e)
{
this.Worker.RunWorkerAsync();
}
Este es un artículo que se expande en la misma línea de pensamiento que usted está atravesando: http://www.dev102.com/2008/06/24/how-do-you-exit-your-net-application/
Básicamente:
Environment.Exit: desde MSDN: finaliza este proceso y proporciona 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.
Application.Exit: desde MSDN: informa todas las bombas de mensajes que deben finalizar, 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. Hay más problemas sobre este método, lea sobre él en la página de MSDN.
Otra discusión de esto: http://geekswithblogs.net/mtreadwell/archive/2004/06/06/6123.aspx
Este artículo señala un buen consejo:
Puede determinar si se ha llamado a System.Windows.Forms.Application.Run 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)
{
// Use this since we are a WinForms app
System.Windows.Forms.Application.Exit();
}
else
{
// Use this since we are a console app
System.Environment.Exit(1);
}
Prueba esto :
en el archivo Program.cs:
después de Application.Run (new form ());
agregar Application.Exit ();