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