Maison >développement back-end >C++ >Comment résoudre l'erreur « Opération cross-thread non valide » dans le multithreading C# ?
Gestion de l'exception « Opération cross-thread non valide » dans les applications multithread C#
Dans les applications C# employant plusieurs threads, il est essentiel de garantir que les éléments de l'interface utilisateur sont accessibles exclusivement par le thread responsable de leur création. La violation de ce principe conduit à la redoutable exception « Opération cross-thread non valide ».
Comprendre le threading C# et la propriété des éléments d'interface utilisateur
C# permet une exécution simultanée via plusieurs threads. Chaque thread fonctionne indépendamment dans son propre contexte. Fondamentalement, les éléments de l'interface utilisateur (comme les zones de texte) appartiennent à un fil de discussion spécifique, généralement le fil de discussion principal de l'interface utilisateur.
Le problème : accéder aux éléments de l'interface utilisateur à partir de discussions non autorisées
L'erreur se produit lorsqu'un thread autre que le thread propriétaire tente de modifier les propriétés d'un élément de l'interface utilisateur. Il s'agit d'un scénario courant, souvent rencontré lors de la gestion d'événements provenant de threads d'arrière-plan (comme la réception de données sur le port série).
La solution : implémenter l'invocation du répartiteur
La solution consiste à utiliser un répartiteur pour regrouper les opérations sur le bon thread. Cela garantit des modifications thread-safe des contrôles de l'interface utilisateur.
Mise en œuvre du code
Voici comment mettre en œuvre cette solution :
Tout d'abord, définissez un délégué :
<code class="language-csharp">private delegate void SetTextCallback(string text);</code>
Ensuite, créez une méthode pour mettre à jour la zone de texte en toute sécurité :
<code class="language-csharp">private void SetText(string text) { if (this.textBox1.InvokeRequired) { SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { text }); } else { this.textBox1.Text = text; } }</code>
Enfin, dans le gestionnaire d'événements de données reçues de votre port série, appelez la méthode SetText
:
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { txt += serialPort1.ReadExisting(); SetText(txt); }</code>
Cette approche garantit que la propriété textBox1.Text
est mise à jour en toute sécurité, évitant ainsi l'exception « Opération cross-thread non valide ». Le InvokeRequired
contrôle détermine efficacement si un appel au répartiteur est nécessaire.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!