【发布时间】:2010-04-23 03:18:39
【问题描述】:
我知道DataReceived event 是在后台线程上触发的。如何告诉 GUI 线程在事件处理程序中显示数据?
【问题讨论】:
标签: .net winforms multithreading
我知道DataReceived event 是在后台线程上触发的。如何告诉 GUI 线程在事件处理程序中显示数据?
【问题讨论】:
标签: .net winforms multithreading
此代码假定您已经添加了一个表单级 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;
}
【讨论】:
您可以使用表单上的IsInvokeRequired and BeginInvoke 方法将控制权切换回 UI 线程。
在某些情况下,我还使用计时器来监视某些共享数据结构(例如消息列表)的变化。但是,当您从某个后台线程收到相当稳定的消息流时,这种方法效果最好。
【讨论】: