Pregunta

Estoy tratando de averiguar qué que debería usar. Al cerrar mis WinForm incendios de aplicaciones de un formulario en el modo de diálogo. Esa forma se ejecuta un trabajador de fondo que se sincroniza la base de datos con la base de datos remota y muestra su progreso en el "formulario de inicio."

Tengo 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 Form_FormClosing(). Application.Exit() da el siguiente error ->

  

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

Ahora leo que Environment.Exit() es brutal y significa que es probable que haya algo malo en su aplicación (véase aquí ).

Producción Application.ExitThread() pero estoy concered que sólo puede estar apareciendo a trabajar y ya que nunca he usado antes no estoy seguro de que cuando normalmente es apropiado hacerlo.

¿Fue útil?

Solución

Por desgracia, el problema no es causado por cualquiera de estos, y realmente existe (incluso si usted no recibe el mensaje) en todos estos escenarios.

Su problema es el siguiente:

  

Al cerrar mis fuegos WinForm de la aplicación de un formulario en el modo de diálogo. Esa forma se ejecuta un trabajador de fondo que se sincroniza la base de datos con la base de datos remota y muestra su progreso en el "formulario de inicio."

Dado que usted no está realmente apagar cuando se solicita un cierre, todas las funciones de "salida" están tratando de derribar el hilo de fondo. Por desgracia, esto es, probablemente, sucediendo en el medio de la sincronización de base de datos, y una enumeración de trabajo en la lógica ahorra es probable que proporciona ese error.

Yo recomendaría no utilizar ninguno de estos - sólo llame myMainForm.Close() lugar. Eso debería cerrar el formulario principal, que se disparará la lógica de cierre apropiadamente. Una vez que la forma principal en su aplicación se cierra, que se apagará correctamente.

Otros consejos

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

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

Por la salida de rosca, que son sólo de salir del contexto del subproceso actual, mientras que deja cualquier Temas de primer plano en funcionamiento. Sospecho que el hilo que está causando el error sigue en funcionamiento, por lo que he enmascarado esencialmente el problema, sin trabajar alrededor de ella. Me gustaría tratar de averiguar por qué usted está recibiendo esta "Collection was modified; enumeration operation may not execute." error en la salida. Se trata de ser expuesto por Application.Exit(), pero no es causada por el mismo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top