"Si un ouvrier veut bien faire son travail, il doit d'abord affûter ses outils." - Confucius, "Les Entretiens de Confucius. Lu Linggong"
Page de garde > La programmation > Comment mettre à jour en toute sécurité les éléments d'interface utilisateur des threads non UI en C #?

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

Publié le 2025-02-06
Parcourir:985

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

Évitez les erreurs croisées: mise à jour des éléments d'interface utilisateur en toute sécurité à partir de threads non UI

Lors de l'interaction avec des éléments d'interface utilisateur à partir de threads non UI (tels que les threads générés en recevant des événements à partir de données de port série), les problèmes de sécurité des threads doivent être traités pour éviter les erreurs de fil transversal.

Dans le code C #, l'erreur "L'opération transversale n'est pas valide: le contrôle d'accès 'TextBox1' 'à partir d'un thread autre que le thread qui a créé le contrôle' TextBox1 '" se produit parce que le thread d'interface utilisateur possède le contrôle TextBox1 et l'accès à l'accès à partir d'un autre fil provoque des conflits d'association de threads.

Pour résoudre ce problème, un planificateur doit être utilisé pour permettre des threads appropriés (généralement des threads d'interface utilisateur) pour accéder aux éléments d'interface utilisateur. Dans ce cas, les méthodes de délégué et d'invocation peuvent être utilisées pour assurer l'accès à filetage:

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;
  }
}

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

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
  txt  = serialPort1.ReadExisting().ToString();
  SetText(txt.ToString());
}

À l'aide de la méthode SetText, vous pouvez déléguer des tâches qui mettent à jour l'attribut de texte TextBox1 au thread d'interface utilisateur, en garantissant un accès sûr sans erreur aux éléments d'interface utilisateur à partir de threads non UI.

Dernier tutoriel Plus>

Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.

Copyright© 2022 湘ICP备2022001581号-3