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

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

Mary-Kate Olsen
发布: 2025-01-23 02:27:10
原创
877 人浏览过

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

C#跨线程操作验证:从非UI线程访问控件

在非创建控件的线程中访问UI元素(例如TextBox)时,可能会遇到异常:“跨线程操作无效:从非创建它的线程访问控件'textBox1'”。这是因为每个UI元素都与一个特定线程关联,用于处理事件和修改。

在本例中,您尝试从serialport1_DataReceived事件处理程序更新textBox1控件,由于串口操作的异步特性,该处理程序在单独的线程上执行。

解决方案:

为了解决此问题并安全地从非UI线程访问textBox1控件,您需要确保所有与UI元素的交互都在主(UI)线程上调用。这可以使用调度程序来实现,调度程序提供了一种跨线程通信机制,并确保UI更新在正确的线程上执行。

以下是使用委托安全更新textBox1控件的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>
登录后复制

通过这种方法,您可以确保始终在主(UI)线程上访问和修改textBox1控件,从而解决跨线程操作异常。

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

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