Comment empêcher l'exception ObjectDisposedException en C # lors du dessin et de la fermeture des applications

StackOverflow https://stackoverflow.com/questions/90662

  •  01-07-2019
  •  | 
  •  

Question

Je suis un étudiant en CompSci, et je suis assez nouveau en C #, et je faisais un "problème de Josèphe". programme pour une classe et j’ai créé un bouton Exit qui appelle Application.Exit () à quitter à tout moment, mais si C # travaille toujours sur la peinture et que le bouton est enfoncé, il lance une ObjectDisposedExeception pour l’objet Graphics. Est-il un moyen d'empêcher cela?. Je pensais essayer {} catch ou changer un booléen pour indiquer au processus de peinture de s'arrêter avant de quitter, mais je veux savoir s'il existe une autre solution.

Était-ce utile?

La solution

Cela ne devrait pas être possible. Si le bouton est créé sur le même thread que la fenêtre, ils partagent une pompe de message et le gestionnaire de peinture ne peut pas être interrompu pour gérer le bouton de sortie. Le message indiquant que le bouton a été cliqué sera mis en file d'attente dans la file de messages du thread jusqu'au retour du gestionnaire Paint.

En général, vous devez reporter la peinture sur le gestionnaire Paint (ou remplacer OnPaint) et, partout où vous devez mettre à jour l'écran, appelez la méthode Invalidate du contrôle. Cela indique à Windows qu’une zone doit être repeinte et qu’une fois tous les autres messages traités, elle générera un message WM_PAINT qui appellera finalement OnPaint, qui à son tour déclenchera l’événement Paint.

Si vous animez, utilisez un System.Windows.Forms.Timer pour déclencher chaque image, plutôt que d'utiliser un fil. Les callbacks System.Threading.Timer sont exécutés sur le pool de threads, ils sont donc toujours sur le mauvais thread pour manipuler l'interface utilisateur.

Autres conseils

Vous devriez être appelée méthode Close () du formulaire contenant le bouton afin de fermer le formulaire de manière ordonnée. La fermeture du formulaire principal entraînera de toute façon la fermeture de l'application.

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