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
Libérer: 2025-01-23 02:25:10
original
579 Les gens l'ont consulté

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é :

private delegate void SetTextCallback(string text);
Copier après la connexion

Ensuite, créez une méthode pour mettre à jour la zone de texte en toute sécurité :

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;
    }
}
Copier après la connexion

Enfin, dans le gestionnaire d'événements de données reçues de votre port série, appelez la méthode SetText :

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    txt += serialPort1.ReadExisting();
    SetText(txt);
}
Copier après la connexion

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 de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal