Maison >développement back-end >C++ >Comment résoudre l'erreur « Opération cross-thread non valide » dans le multithreading C# ?

Comment résoudre l'erreur « Opération cross-thread non valide » dans le multithreading C# ?

Linda Hamilton
Linda Hamiltonoriginal
2025-01-23 02:25:10560parcourir

How to Solve the

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn