处理 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中文网其他相关文章!