2010-10-24 12 views
0

Possible Duplicate:
Cross-thread operation not valid: Control accessed from a thread other than the thread it was created onObtenir le fonctionnement inter-threads pas valable dans C#

Je travaille sur un code où j'initialiser un objet (dans ce cas une forme), qui tourne au ralenti alors jusqu'à ce qu'il soit reçoit un message d'une personne, ou d'un de ses méthodes est invoqué directement.

Dans mon formulaire, j'ai une liste (lTester) qui montre tous les appels faits à ce formulaire. Au cours de l'exécution, je reçois l'erreur suivante:

Cross-thread operation not valid: Control 'lTester' accessed from a thread other than the thread it was created on.

Je n'ai pas commencé les discussions manuellement, en fait, je ne l'ai jamais travaillé avec eux et je ne sais pas vraiment comment C# gère en interne les composants de l'interface utilisateur. Y a-t-il un moyen de contourner cela?

+0

Comment mettre à jour votre listbox au cas où vous recevriez un message? Pouvez-vous montrer votre code? Vérifiez la propriété Control.InvokeRequired (System.Windows.Forms) http://bit.ly/c8dws8 –

+0

Que signifie recevoir un message? Est-ce que cela vient d'un autre composant? –

+0

rayer la partie du message. Je mets à jour ma listbox via le lTester.Items.Add (""); commander. En d'autres termes, j'ai une méthode appelée mise à jour et j'y exécute la commande ci-dessus. Donc, d'une autre classe, j'appellerai tester.update (x) – user472875

Répondre

1

Si vous voulez savoir d'où vient votre thread, vous pouvez placer un point d'arrêt dans la méthode que vous appelez (où l'erreur est générée), ouvrez les threads et Stack Trace Windows dans VS et voir ce qui a initié l'appel pour commencer.

Même si le code se trouve dans votre classe Form, l'appelant désapprend toujours dans quel thread l'appel est exécuté. C'est pourquoi, comme l'a déclaré Oskar, vous devez vérifier si vous avez besoin de Invoke au thread principal. Il ya des tonnes d'exemples sur la façon de le faire, juste Google InvokeRequired et aller à partir de là. Faites-moi savoir si vous avez besoin d'un exemple.

+0

OK, je suppose que ça va le faire pour ce cas. Ce qui me dérange, c'est que je ne comprends pas d'où viennent ces multiples choses, à savoir: comment tout cela fonctionne en interne. – user472875

+1

Et puisque vous ne publiez aucun code, nous non plus. Vous dites "recevoir des messages de quelqu'un", qu'est-ce que cela signifie exactement? Recevoir comment? De qui ou quoi? –

+0

C'était une erreur que ma classe de testeur a réellement des événements qu'elle peut élever et qui sont attrapés et manipulés par d'autres classes. en ce qui concerne la réception des messages, je mets à jour ma liste de diffusion via le lTester.Items.Add (""); commander. En d'autres termes, j'ai une méthode appelée mise à jour et j'y exécute la commande ci-dessus. Donc, à partir d'une autre classe, je voudrais appeler tester.update (x) – user472875

2

Avant de toucher le ITester, vous devez vérifier la valeur InvokeRequired. Si c'est le cas, appelez la fonction