Pregunta Application.Exit () vs Application.ExitThread () vs Environment.Exit ()


Estoy tratando de descubrir cuál debería estar usando. Al cerrar mi aplicación WinForm se desencadena un formulario en el modo de diálogo. Ese formulario ejecuta un Trabajador de Antecedentes que Sincroniza el DB con el DB remoto y muestra su progreso en el "Formulario de bienvenida".

Tengo un método como ese:

private void CloseMyApp()
{
    SaveUserSettings();

    splashForm = new SplashForm();
    splashForm.ShowDialog();

    Application.ExitThread();
    //Application.Exit();
}

que es lo que llamo para cerrar mi aplicación desde Menú -> Salir y en el Form_FormClosing() evento. Application.Exit() da el siguiente error ->

La colección fue modificada; la operación de enumeración no se puede ejecutar.

Ahora leo eso Environment.Exit() es brutal y significa que probablemente haya algo mal con tu aplicación (ver aquí)

Application.ExitThread() funciona, pero estoy seguro de que puede que solo esté APAREZANDO para funcionar y, como nunca antes lo he usado, no estoy seguro de cuándo es apropiado hacerlo.


32
2017-08-21 16:10


origen


Respuestas:


Desafortunadamente, el problema no está causado por ninguno de estos, y realmente existe (incluso si no recibe el mensaje) en todos estos escenarios.

Tu problema es este:

Al cerrar mi aplicación WinForm se desencadena un formulario en el modo de diálogo. Ese formulario ejecuta un Trabajador de Antecedentes que Sincroniza el DB con el DB remoto y muestra su progreso en el "Formulario de bienvenida".

Como en realidad no se está cerrando cuando solicita un apagado, todas las funciones de "Salida" están tratando de derribar el hilo de fondo. Desafortunadamente, esto probablemente esté sucediendo en el medio de su sincronización de base de datos, y una enumeración que trabaje en la lógica de salvar probablemente esté proporcionando ese error.

Yo recomendaría no usar ninguno de estos, solo llame myMainForm.Close() en lugar. Eso debería cerrar su formulario principal, lo que disparará su lógica de cierre de manera apropiada. Una vez que se cierre el formulario principal en su aplicación, se cerrará correctamente.


24
2017-08-21 16:51



Environment.Exit() se usa para aplicaciones de consola.

Desea usar: System.Windows.Forms.Application.Exit()

Al salir del subproceso, solo está saliendo del contexto del subproceso actual, mientras deja en ejecución cualquier subproceso en primer plano en ejecución. Sospecho que el hilo que está causando el error aún se está ejecutando, por lo que esencialmente ha enmascarado el problema, no se ha solucionado. Intentaré averiguar por qué recibes este error "Collection was modified; enumeration operation may not execute." a la salida Está siendo expuesto por Application.Exit(), pero no es causado por eso.


9
2017-08-21 16:16