运行20秒后穿过线程
本文关键字:线程 20秒 运行 | 更新日期: 2023-09-27 18:14:42
我从串行端口接收数据,并以它们到达多行文本框的格式显示所有接收到的数据。这是我的串行监视器"txtOutput"。在将数据验证为完整消息并过滤掉几个字符(在单独的类中)之后,我需要将这些数据显示给其他文本框(textBox7、2和6)。由于某些原因,我无法理解,经过10到20秒的调试,随着消息的不断传入(200-300毫秒),我得到一个跨线程错误,"跨线程操作无效:从创建它的线程以外的线程访问控制"。
这是我的代码:
串口读取
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
SetText(serialPort1.ReadExisting());
}
catch (Exception ex)
{
SetText(ex.ToString());
}
}
委托SetText delegate void SetTextCallback(string text);
接收串口数据并详细说明
private void SetText(string text)
{
if (this.txtOutput.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.BeginInvoke(d, new object[] { text });
}
else
{
txtOutput.AppendText(text);
}
string a="", b="", c="";
string invia = text.ToString();
Stripper strp = new Stripper();
strp.Distri(invia, out a, out b, out c);
textBox7.Text = a; // Current
textBox2.Text = b; //Temperature
textBox6.Text = c; //RPM
}
}
这是我第一个应用程序之一。我需要做些什么来避免交叉线程错误,我犯的错误在哪里?
您已经获得了一些代码,这些代码更改了受invokerrequirequired保护的部分之外的UI元素。所有的文本框也需要被保护。
试试这个:
private void SetText(string text)
{
if (this.txtOutput.InvokeRequired)
{
SetTextCallback d = new SetTextCallback(SetText);
this.BeginInvoke(d, new object[] { text });
}
else
{
txtOutput.AppendText(text);
string a="", b="", c="";
string invia = text.ToString();
Stripper strp = new Stripper();
strp.Distri(invia, out a, out b, out c);
textBox7.Text = a; // Current
textBox2.Text = b; //Temperature
textBox6.Text = c; //RPM
}
}