2010-05-30 18 views
3

J'ai une application client-serveur, dans laquelle j'utilise des Sockets et des threads classiques pour recevoir/envoyer des données et écouter des clients.Le formulaire est en quelque sorte éliminé

L'application fonctionne très bien, mais après un certain temps au hasard je reçois le ObjectDisposedException:

System.ObjectDisposedException: Cannot access a disposed object. 
Object name: 'MainForm'. 
    at System.Windows.Forms.Control.MarshaledInvoke(Control caller, Delegate method, Object[] args, Boolean synchronous) 
    at System.Windows.Forms.Control.Invoke(Delegate method, Object[] args) 
    at System.Windows.Forms.Control.Invoke(Delegate method) 

Ce code est appelé à partir de fil de socket client et j'utiliser Invoke() méthode pour exécuter le code sur Fil d'interface utilisateur.

Je suis sûr que je ne dispose pas le formulaire manuellement ni en utilisant Fermer() (le formulaire est fermé par l'utilisateur en cliquant sur le bouton Fermer), donc je ne sais pas ce qui pourrait causer son élimination.

Modifier: Exception n'est pas jeté lors de la fermeture de forme - il arrive tout à fait au hasard.

+0

Avez-vous trouvé une solution à ce problème? J'ai un problème similaire, bien qu'il ne s'agisse pas d'un formulaire. Ou vous souvenez-vous même, comme c'était il y a plus d'un an. :) Sinon, pas de problème. – M3NTA7

+0

Non, je ne me rappelle pas quel était le problème. Cependant, je suis assez sûr, que le problème était dans mon code, que la forme a été éliminée. Donc, fondamentalement, ma solution ne serait même pas adaptée à votre problème. Vous devriez regarder de plus près votre code (avec le débogage, bien sûr) et trouver le coupable. – mnn

Répondre

1

Avez-vous essayé d'ignorer la méthode Dispose et d'y insérer un point d'arrêt? Le callstack vous donnerait probablement une indication de pourquoi/où il est disposé.

0

J'ai eu un problème similaire, je cachais juste une forme et ne la fermais jamais ou ne la jetais pas.

La cause à la racine de la forme en cours d'élimination était due à un DialogResult d'un bouton Annuler qui forçait réellement le formulaire Fermer, puis la disposition était implicite.

Pour surmonter cela, je viens de retirer le dialogue DialogResult du formulaire.

+0

Même si je ne me souviens pas, quelle était la cause (donc je ne peux pas vraiment choisir une réponse, ou en écrire une moi-même), d'autres pourraient l'utiliser. Donc, merci pour la réponse. – mnn