我知道DataReceived event是在后台线程上触发的。如何告诉GUI线程在事件处理程序中显示数据?
答案 0 :(得分:1)
您可以使用表单上的IsInvokeRequired and BeginInvoke方法将控制权切换回UI线程。
在某些情况下,我还使用计时器来监视某些共享数据结构中的更改,例如消息列表。但是当你从一些后台线程获得非常稳定的消息流时,这种方法效果最好。
答案 1 :(得分:1)
此代码假设您已添加了一个表单级SerialPort
对象,其port_DataReceived
事件附加了DataReceived
方法,并且您有一个名为label1
的标签在你的表格上。
我不是100%肯定将端口中可用字节转换为字符串的代码,因为我没有使用实时串行端口收集数据来运行它。但是,无论事件是否在不同的线程上,此代码都允许您显示接收的数据。
void port_DataReceived(object sender, SerialDataReceivedEventArgs e)
{
SerialPort port = (SerialPort)sender;
byte[] buffer = new byte[port.BytesToRead];
port.Read(buffer, 0, buffer.Length);
string data = UnicodeEncoding.ASCII.GetString(buffer);
if (label1.InvokeRequired)
{
Invoke(new EventHandler(DisplayData), data, EventArgs.Empty);
}
else
{
DisplayData(data, EventArgs.Empty);
}
}
private void DisplayData(object sender, EventArgs e)
{
string data = (string)sender;
label1.Text = data;
}