Question

Je suis en train de comprendre que je devrais utiliser. En fermant les feux d'applications WinForm d'un formulaire en mode dialogue. Cette forme exécute un travailleur de fond qui permet de synchroniser la base de données avec la base de données à distance et l'affiche est un progrès sur le « formulaire Splash ».

J'ai une méthode comme ceci:

private void CloseMyApp()
{
    SaveUserSettings();

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

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

qui est ce que j'appelle à fermer mon application de Menu -> Quitter et en cas de Form_FormClosing(). Application.Exit() donne l'erreur suivante ->

  

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

Maintenant, je lis que Environment.Exit() est brutale et signifie qu'il ya probablement quelque chose de mal avec votre application (voir ).

fonctionne Application.ExitThread() mais je suis concered qu'il ne peut comparaîtrons travailler et comme je l'ai jamais utilisé avant que je ne suis pas sûr quand il est normalement approprié de le faire.

Était-ce utile?

La solution

Malheureusement, le problème ne provient pas toutes ces choses, et existe vraiment (même si vous ne recevez pas le message) dans tous ces scénarios.

Votre problème est le suivant:

  

En fermant les feux WinForm App d'un formulaire en mode dialogue. Cette forme exécute un travailleur de fond qui permet de synchroniser la base de données avec la base de données à distance et l'affiche est un progrès sur le « formulaire Splash ».

Puisque vous n'êtes pas fermer réellement vers le bas lorsque vous demandez un arrêt, toutes les fonctions « Exit » tentent de déchirer votre fil d'arrière-plan. Malheureusement, ce qui se passe probablement au milieu de votre synchronisation DB et une énumération de travail dans la logique sauver fournit probablement cette erreur.

Je ne recommanderais pas utiliser ces - il suffit d'appeler myMainForm.Close() à la place. Cela devrait fermer votre principale forme, ce qui déclenche votre logique de fermeture appropriée. Une fois le formulaire principal dans votre application se ferme, il se met hors gracieusement.

Autres conseils

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

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top