É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>
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>
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!