C# 运行20秒后交叉线程
我从串行端口接收数据,并以多行文本框中的格式显示所有接收到的数据。这是我的串行监视器“TXT输出”。 在我将数据验证为完整消息并过滤掉几个字符(在单独的类中)之后,我需要将这些数据显示到其他文本框(textBox7、2和6)。 由于某些我无法理解的原因,在10到20秒的调试之后,随着消息不断(200-300毫秒)传入,我得到了一个跨线程错误,“跨线程操作无效:从创建控件的线程以外的线程访问控件” 这是我的代码: 串口读取C# 运行20秒后交叉线程,c#,multithreading,C#,Multithreading,我从串行端口接收数据,并以多行文本框中的格式显示所有接收到的数据。这是我的串行监视器“TXT输出”。 在我将数据验证为完整消息并过滤掉几个字符(在单独的类中)之后,我需要将这些数据显示到其他文本框(textBox7、2和6)。 由于某些我无法理解的原因,在10到20秒的调试之后,随着消息不断(200-300毫秒)传入,我得到了一个跨线程错误,“跨线程操作无效:从创建控件的线程以外的线程访问控件” 这是我的代码: 串口读取 private void serialPort1_DataReceive
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try
{
SetText(serialPort1.ReadExisting());
}
catch (Exception ex)
{
SetText(ex.ToString());
}
}
委托设置文本
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
}
}
这是我的第一个应用程序之一。
我需要更改什么以避免交叉线程错误?我犯的错误在哪里?您有一些代码可以更改受所需调用程序保护的部件之外的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
}
}
答对 了它正在工作,因为我试图得到它。谢谢。我的下一个问题是,这些文本框中的数据只出现很短的时间。一旦任何文本框中出现新值,另一个文本框就会被取消。也许我应该就这个新问题提出一个不同的问题。谢谢你的帮助。@FeliceM是的,一个新问题是合适的。