在 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";
}