28 votes

Application.Exit() vs Demande.ExitThread() par rapport à l'Environnement.Exit()

Je suis à essayer de comprendre qui je devrais être en utilisant. Sur la fermeture de mon application WinForm feux d'un Formulaire dans la boîte de Dialogue mode. Ce formulaire s'exécute un Fond travailleur qui Synchronise la DB avec la distance DB et affiche la progression sur le "Splash Forme."

J'ai une méthode comme suit:

private void CloseMyApp()
{
    SaveUserSettings();

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

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

qui est ce que j'appelle de fermer mon application à partir du Menu --> Sortie et dans l' Form_FormClosing() événement. Application.Exit() donne l'erreur suivante -->

La Collection a été modifiée; opération d'énumération peut pas s'exécuter.

Maintenant, j'ai lu qu' Environment.Exit() est brutal et signifie qu'il y a probablement quelque chose de mal avec votre application (voir ici).

Application.ExitThread() fonctionne, mais je suis concered qu'il ne peut être semblant et comme je ne l'ai jamais utilisé avant, je ne suis pas sûr de quand il est généralement approprié de le faire.

22voto

Reed Copsey Points 315315

Malheureusement, le problème n'est pas causé par l'un de ces, et qui existe réellement (même si vous ne recevez pas le message) dans tous ces scénarios.

Votre problème est le suivant:

Sur la fermeture de mon Application WinForm feux d'un Formulaire dans la boîte de Dialogue mode. Ce formulaire s'exécute un Fond travailleur qui Synchronise la DB avec la distance DB et affiche la progression sur le "Splash Forme."

Puisque vous n'êtes pas en train d'arrêter quand vous le demande un arrêt, toutes les de la "Sortie" des fonctions tentent d'abattre votre thread d'arrière-plan. Malheureusement, c'est probablement passe dans le milieu de votre base de données de synchronisation, et une énumération de travail dans l'enregistrer logique est probablement fournir de l'erreur.

Je voudrais vous recommandons de ne pas utiliser l'un de ces - appelez - myMainForm.Close() à la place. Que doit fermer votre formulaire principal, qui va mettre le feu à votre clôture de la logique de façon appropriée. Une fois le formulaire principal dans votre application se ferme, il s'arrête en douceur.

7voto

Alan Points 21367

Environment.Exit() est utilisé pour la console de apps.

Vous souhaitez utiliser: System.Windows.Forms.Application.Exit()

En sortant de fil, vous êtes seulement à la sortie de l'actuel contexte de thread, tout en laissant tout a commencé à en premier plan les threads en cours d'exécution. Je soupçonne que le fil qui est à l'origine de l'erreur est toujours en cours d'exécution, alors vous avez essentiellement masqué le problème, pas travaillé autour d'elle. Je voudrais essayer de comprendre pourquoi vous obtenez cette erreur "Collection was modified; enumeration operation may not execute." à la sortie. Il est exposé en Application.Exit(), mais il n'est pas causé par elle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X