【发布时间】:2013-07-11 12:08:14
【问题描述】:
在 Visual C# / .Net 应用程序中,我必须读取 SerialPort,因此我为其分配了一个 DataReceivedEventHandler。
但是,我当然不能直接从处理程序更改 UI 控件,因为它们位于单独的线程上。
解决方案似乎是使用 Control.Invoke,但是,我有太多 UI 操作要执行,所以我担心我可能没有走正确的道路。
我应该做以下哪一项?
选项 A:仍然坚持 Invoke,并使用 Invoke 对每个控件执行每个操作。
选项 B:放置一个 50 毫秒的重复计时器,每 50 毫秒检查一次布尔值是否为 DataReceived == true,如果是,则相应地更新 UI 控件。 (每次我在串行端口 DataReceivedEventHandler 中读取数据时,DataReceived 设置为 true,否则为 false。)
选项 C:还有其他选项吗?
更新:
通过以下方式成功(基于@tcarvin 的回答和@Hans Passant 的评论)。
private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{
if (this.InvokeRequired())
{
this.BeginInvoke(new EventHandler<SerialDataReceivedEventArgs>(DataReceivedHandler), new object[] { sender, e });
return;
}
tbSerialStatus.Text = "Received text";
}
【问题讨论】:
-
尽量缓冲收到的数据。经常调用没有多大意义,你只需要让人类的眼睛开心。无论如何,经常这样做是有问题的,它可能会导致 UI 线程收到太多调用请求并停止绘制的 Firehose 问题。
标签: c# .net multithreading visual-studio-2010 visual-studio