首页 >后端开发 >C++ >如何解决C#多线程中'跨线程操作无效”错误?

如何解决C#多线程中'跨线程操作无效”错误?

Linda Hamilton
Linda Hamilton原创
2025-01-23 02:25:10519浏览

How to Solve the

处理 C# 多线程应用程序中的“跨线程操作无效”异常

在使用多线程的 C# 应用程序中,确保 UI 元素由负责创建它们的线程独占访问至关重要。 违反这一原则会导致可怕的“跨线程操作无效”异常。

了解 C# 线程和 UI 元素所有权

C# 允许通过多个线程并发执行。每个线程在其自己的上下文中独立运行。 至关重要的是,UI 元素(如文本框)属于特定线程,通常是主 UI 线程。

问题:从未经授权的线程访问 UI 元素

当拥有线程以外的线程尝试修改 UI 元素的属性时,会出现此错误。 这是一种常见的场景,在处理来自后台线程的事件(例如串口数据接收)时经常遇到。

解决方案:实现调度程序调用

解决方案涉及使用调度程序将操作封送到正确的线程上。 这保证了 UI 控件的线程安全修改。

代码实现

以下是实施此解决方案的方法:

首先,定义一个委托:

<code class="language-csharp">private delegate void SetTextCallback(string text);</code>

接下来,创建一个方法来安全更新文本框:

<code class="language-csharp">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>

最后,在串口数据接收事件处理程序中,调用SetText方法:

<code class="language-csharp">private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
    txt += serialPort1.ReadExisting();
    SetText(txt);
}</code>

此方法可确保 textBox1.Text 属性安全更新,防止出现“跨线程操作无效”异常。 InvokeRequired 检查有效地确定是否需要调度程序调用。

以上是如何解决C#多线程中'跨线程操作无效”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn