Maison > développement back-end > C++ > Comment mettre à jour en toute sécurité des éléments d'interface utilisateur à partir de threads non-UI en C# ?

Comment mettre à jour en toute sécurité des éléments d'interface utilisateur à partir de threads non-UI en C# ?

Susan Sarandon
Libérer: 2025-01-23 02:14:15
original
285 Les gens l'ont consulté

How to Safely Update UI Elements from Non-UI Threads in C#?

Évitez les erreurs entre threads : mettez à jour en toute sécurité les éléments de l'interface utilisateur à partir de threads non-UI

Lors de l'interaction avec des éléments de l'interface utilisateur à partir d'un thread non-UI (tel que le thread généré par un événement de réception de données sur le port série), les problèmes de sécurité des threads doivent être gérés pour éviter les erreurs entre threads.

Dans le code C#, l'erreur « Opération cross-thread non valide : accès au contrôle 'textBox1' à partir d'un thread autre que le thread qui a créé le contrôle 'textBox1' » se produit car le thread de l'interface utilisateur possède le contrôle textBox1 et y accède depuis un autre le thread provoquera des conflits d'affinité de thread.

Pour résoudre ce problème, un planificateur doit être utilisé pour permettre au thread approprié (généralement le thread de l'interface utilisateur) d'accéder aux éléments de l'interface utilisateur. Dans ce cas, les délégués et la méthode Invoke peuvent être utilisés pour garantir un accès thread-safe :

<code class="language-csharp">delegate void SetTextCallback(string text);

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

Maintenant, dans le gestionnaire d'événements SerialPort1_DataReceived :

<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
  txt += serialPort1.ReadExisting().ToString();
  SetText(txt.ToString());
}</code>
Copier après la connexion

En utilisant la méthode SetText, vous pouvez déléguer la tâche de mise à jour de la propriété text de textBox1 au thread de l'interface utilisateur, garantissant ainsi un accès sûr et sans erreur aux éléments de l'interface utilisateur à partir de threads non-UI.

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!

source:php.cn
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