首页 > 后端开发 > C++ > 如何在 C# 中从非 UI 线程安全地更新 UI 元素?

如何在 C# 中从非 UI 线程安全地更新 UI 元素?

Susan Sarandon
发布: 2025-01-23 02:14:15
原创
248 人浏览过

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

避免跨线程错误:安全地从非 UI 线程更新 UI 元素

在从非 UI 线程(例如串口数据接收事件生成的线程)与 UI 元素交互时,必须处理线程安全问题以避免跨线程错误。

在 C# 代码中,错误“跨线程操作无效:从创建控件 'textBox1' 的线程以外的线程访问控件 'textBox1'”的出现是因为 UI 线程拥有 textBox1 控件,而从另一个线程访问它会导致线程关联性冲突。

为了解决这个问题,必须使用调度程序,允许适当的线程(通常是 UI 线程)访问 UI 元素。在这种情况下,可以使用委托和 Invoke 方法来确保线程安全访问:

<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>
登录后复制

现在,在 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>
登录后复制

通过使用 SetText 方法,您可以将更新 textBox1 text 属性的任务委托给 UI 线程,从而确保从非 UI 线程安全无误地访问 UI 元素。

以上是如何在 C# 中从非 UI 线程安全地更新 UI 元素?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板