2010-06-23 4 views
4

Je n'utilise pas (intentionnellement) de threads dans mon application C#. En fait, ma méthode principale a un [STAThread], ce que je pensais signifier que je n'utiliserais qu'un thread. Pourquoi alors, est-ce que j'obtiendrais ce message d'erreur?Pourquoi un contrôle serait-il sur un thread différent de celui dans lequel je travaille?

Opération croisée non valide: Contrôlez 'messageLog' accédé à partir d'un thread autre que le thread sur lequel il a été créé.

Répondre

6

Il existe deux types qui peuvent provoquer l'exécution de votre code sur différents threads sans aucun appel explicite à System.Threading. En particulier FileSystemWatcher et BackgroundWorker viennent à l'esprit. Utilisez-vous l'un de ces types?

De plus, STAThread ne limite en rien la capacité de votre processus à engendrer des threads. Il définit à la place le type d'appartement COM du thread d'application initial.

+1

System.Timers.Timer étant un autre – nos

+0

@Nos J'utilise des timers - je suppose que c'est ce qui l'a causé. –

+3

Utilisez System.Windows.Forms.Timer s'il s'agit d'une application winfoms, il enverra les événements de minuteur au thread graphique. – nos

2

Marquage méthode main avec [STAThread] ne signifie pas que vous ne pouvez pas engendrer des fils supplémentaires. Vous ne fournissez pas vraiment d'informations sur ce qui déclenche votre code, donc je ne peux pas être plus précis, mais chaque fois que vous exécutez du code asynchrone, il aura lieu sur un autre thread. Faire des choses comme BeginInvoke sur un délégué (ou, d'ailleurs, la plupart des méthodes qui commencent par Begin - et certainement si elles renvoient une IAsyncResult - sont des méthodes asynchrones) exécutera le code (et le rappel) sur un autre thread.

Si vous pouvez fournir plus de détails sur votre situation, je peux essayer de donner des conseils plus spécifiques.

0

[STAThread] n'indique pas que votre application sera monothread. Cela indique seulement que l'application utilisera le thread de manière à permettre aux autres threads de s'exécuter pendant qu'un thread particulier attend une opération qui prend du temps.

En ce qui concerne la raison pour laquelle l'exception de threading croisé est lancée, un peu plus de contexte est nécessaire. Quel type de contrôle est messageLog? Quel code accède à ce contrôle? Utilisez-vous d'autres contrôles utilisant implicitement des threads (par exemple un BackgroundWorker)?

Questions connexes