Vérification des opérations cross-thread C# : accès aux contrôles à partir de threads non-UI
Lorsque vous accédez à des éléments de l'interface utilisateur (tels que TextBox) dans un thread autre que celui qui a créé le contrôle, vous pouvez rencontrer l'exception : « Opération cross-thread non valide : accès au contrôle 'textBox1' à partir d'un thread autre que le thread qui l'a créé". En effet, chaque élément de l'interface utilisateur est associé à un thread spécifique pour gérer les événements et les modifications.
Dans cet exemple, vous essayez de mettre à jour le contrôle serialport1_DataReceived
à partir du gestionnaire d'événements textBox1
, qui s'exécute sur un thread séparé en raison de la nature asynchrone des opérations sur le port série.
Solution :
Pour résoudre ce problème et accéder en toute sécurité au contrôle textBox1
à partir d'un thread non-UI, vous devez vous assurer que toutes les interactions avec les éléments de l'interface utilisateur sont appelées sur le thread principal (UI). Ceci peut être réalisé à l'aide d'un planificateur, qui fournit un mécanisme de communication entre threads et garantit que les mises à jour de l'interface utilisateur sont effectuées sur le bon thread.
Ce qui suit est une version modifiée de la méthode textBox1
utilisant le contrôle délégué de mise à jour de sécurité serialport1_DataReceived
:
<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e) { // 在UI线程上更新'txt'变量 txt += serialPort1.ReadExisting().ToString(); // 使用委托在UI线程上访问'textBox1'控件 SetTextCallback d = new SetTextCallback(SetText); this.Invoke(d, new object[] { txt.ToString() }); } private delegate void SetTextCallback(string text); private void SetText(string text) { // 检查'textBox1'控件是否在不同的线程上创建 if (this.textBox1.InvokeRequired) { this.Invoke(d, new object[] { text }); } else { // 如果在UI线程上创建,则直接更新'textBox1'控件 this.textBox1.Text = text; } }</code>
Avec cette approche, vous vous assurez que les contrôles textBox1
sont toujours accessibles et modifiés sur le thread principal (UI), résolvant ainsi les exceptions d'opération entre threads.
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!