我有以下C#程序,其中包含一个名为 GetForceButton 的按钮和一个名为 ForceTextbox 的多行文本框。这是我目前的代码:
public Form1()
{
InitializeComponent();
System.ComponentModel.IContainer components = new System.ComponentModel.Container();
serialPort1 = new System.IO.Ports.SerialPort(components);
serialPort1.PortName = "COM7";
serialPort1.BaudRate = 9600;
serialPort1.DtrEnable = true;
serialPort1.Open();
serialPort1.DataReceived += new SerialDataReceivedEventHandler(DataReceivedHandler);
}
bool buttonpressed = false;
public void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
SerialPort sp = (SerialPort)sender;
string indata = sp.ReadLine();
if (buttonpressed == true)
{
ForceTextbox.Text = indata + "\n";
}
else
{
ForceTextbox.Text = "No data received";
}
}
private void GetForceButton_Click(object sender, EventArgs e)
{
buttonpressed = true;
}
当我单步执行代码时, indata 从“0.00 \ r”的serialPort中获取值(包括语音括号)。
在步入 ForceTextbox.Text = indata +“\ n”; 行后,正在抛出异常说:
System.Windows.Forms.dll中发生了未处理的“System.InvalidOperationException”类型异常。附加信息:跨线程操作无效:控制从其创建的线程以外的线程访问的“ForceTextbox”。
这是什么意思,或者我做错了什么?
答案 0 :(得分:1)
您需要阅读this link。
您需要确保在启动它们的同一线程上更新GUI组件。大多数情况下,这是由GUI线程完成的。
您将使用该链接中显示的InvokeRequired
。
不幸的是,你必须在C#中这样做。 来自Microsoft的One other tutorial。