web-dev-qa-db-fra.com

Application.exit () vs Application.Exitthread () vs Environnement.exit ()

J'essaie de comprendre que je devrais utiliser. Sur la fermeture de mes feux d'application WinForme d'un formulaire en mode de dialogue. Cette forme exécute un ouvrier de fond qui synchronise la base de données avec la DB distante et affiche sa progression sur le "Forme Splash".

J'ai une méthode comme si:

private void CloseMyApp()
{
    SaveUserSettings();

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

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

c'est ce que j'appelle pour fermer mon application de Menu -> Quitter et dans l'événement Form_FormClosing(). Application.Exit() donne l'erreur suivante ->

La collecte a été modifiée; L'opération d'énumération peut ne pas exécuter.

Maintenant, j'ai lu que Environment.Exit() est brutal et signifie qu'il y a probablement quelque chose qui ne va pas avec votre application (voir ici ).

Application.ExitThread() fonctionne mais je suis concéré que cela ne peut apparaître que travailler et que je ne l'ai jamais utilisé avant de ne le faire pas quand il est normalement approprié de le faire.

32
Refracted Paladin

Malheureusement, le problème n'est pas causé par aucun de ceux-ci et existe vraiment (même si vous ne recevez pas le message) dans tous ces scénarios.

Votre problème est ceci:

Sur la fermeture de mes feux d'application WinForme d'un formulaire en mode de dialogue. Cette forme exécute un ouvrier de fond qui synchronise la base de données avec la DB distante et affiche sa progression sur le "Forme Splash".

Puisque vous ne fermez pas réellement lorsque vous demandez un arrêt, toutes les fonctions "Quitter" essaient de démolir votre fil d'arrière-plan. Malheureusement, cela se passe probablement au milieu de votre synchronisation de base de données et une énumération travaillant dans la logique SAVE fournit probablement cette erreur.

Je recommanderais d'utiliser aucun de ceux-ci - appelez simplement myMainForm.Close() à la place. Cela devrait fermer votre forme principale, qui incendiera votre logique de fermeture de manière appropriée. Une fois la forme principale de votre application se ferme, elle sera fermée gracieusement.

24
Reed Copsey

Environment.Exit() est utilisé pour les applications de console.

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

En sortant du thread, vous ne sortiez que le contexte de thread actuel, tout en laissant des fils de premier plan démarrés en cours d'exécution. Je soupçonne que le fil causant l'erreur est toujours en marche, vous avez donc essentiellement masqué le problème, non pas travaillé autour de lui. J'essaierais de comprendre pourquoi vous obtenez cette erreur "Collection was modified; enumeration operation may not execute." À la sortie. Il est exposé par Application.Exit(), mais cela n'est pas causé par celui-ci.

9
Alan