在Visual C#/ .Net应用程序中,我必须读取SerialPort,因此我将其分配给DataReceivedEventHandler。替代使用Control.Invoke
但是,我当然不能直接从处理程序中更改UI控件,因为它们位于单独的线程中。
该解决方案似乎是使用Control.Invoke,但是,我有太多的UI操作来执行,所以我担心也许我没有走正确的道路。
我应该做以下哪一项?
选项A:与调用坚持无论如何,并且执行每个上的每个使用调用为每个的各种控制的动作。选项B:放置一个50ms重复计时器,其中每50ms检查一次布尔值是否为DataReceived == true,如果是,则相应地更新UI控件。 (每次我读取串行端口DataReceivedEventHandler中的数据时DataReceived设置为true,否则为false)。
选项C:任何其他选项?
UPDATE:
成功具有以下(根据@ tcarvin答案,并@Hans帕桑特的评论)。
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线程获取太多调用请求并停止绘画的问题。 –