2009-08-21 20 views
31

Estoy tratando de averiguar 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".Application.Exit() vs Application.ExitThread() vs Environment.Exit()

que tienen un método de este modo:

private void CloseMyApp() 
{ 
    SaveUserSettings(); 

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

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

que es lo que llamo para cerrar mi aplicación de Menú -> Salir y en el caso . Application.Exit() da el siguiente error - se modificó>

Colección; la operación de enumeración no se puede ejecutar.

Ahora leo que Environment.Exit() es brutal y significa que es probable que haya algo malo en su aplicación (ver here).

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

Respuesta

24

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

Su problema es el siguiente:

En cerrando los incendios WinForm de la aplicación de 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 utilizar ninguno de estos - simplemente llame al myMainForm.Close() en su 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.

9

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

que desea utilizar: System.Windows.Forms.Application.Exit()

saliendo de hilo, sólo está saliendo el contexto hilo actual, mientras que dejar cualquier Temas de primer plano en funcionamiento. 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ía averiguar por qué está recibiendo este error "Collection was modified; enumeration operation may not execute." en la salida. Está siendo expuesto por Application.Exit(), pero no es causado por él.

+1

O si necesita fallar rápidamente después de detectar un error en un controlador de error de nivel superior, después de iniciar sesión si es posible, por supuesto. –

Cuestiones relacionadas