2008-09-18 6 views
1

Je suis un étudiant CompSci, et assez nouveau en C#, et je faisais un programme "Josephus Problem" pour une classe, et j'ai créé un bouton Exit qui appelle Application.Exit() pour quitter à tout moment, mais si C# travaille toujours sur la peinture et que le bouton est enfoncé, il lance ObjectDisposedExeception pour l'objet Graphics. Est-il un moyen d'empêcher cela?. Je pensais essayer {} ou changer un booléen pour dire au processus de peinture de s'arrêter avant de sortir, mais je veux savoir s'il y a une autre solution.Comment faire pour empêcher ObjectDisposedException en C# lors du dessin et de l'application se termine

Répondre

1

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 Paint 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 d'attente des messages du thread jusqu'à ce que le gestionnaire Paint retourne.

Généralement, vous devriez reporter la peinture au gestionnaire Paint (ou remplacer OnPaint) et partout ailleurs 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, une fois tous les autres messages traités, génère un message WM_PAINT qui appellera finalement OnPaint, qui à son tour lancera 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. System.Threading.Timer Les callbacks s'exécutent sur le pool de threads, ils sont donc toujours sur le mauvais thread pour manipuler l'interface utilisateur.

2

Vous devriez être appelé la méthode Close() du formulaire qui contient le bouton afin de fermer le formulaire de manière ordonnée. La fermeture du formulaire principal entraînera la sortie de l'application pour vous.

Questions connexes