gpt4 book ai didi

c# - 使用 Control.Invoke 的替代方法

转载 作者:行者123 更新时间:2023-11-30 20:56:20 25 4
gpt4 key购买 nike

在 Visual C#/.Net 应用程序中,我必须读取 SerialPort,因此我为它分配了一个 DataReceivedEventHandler。

但是,我当然不能直接从处理程序更改 UI 控件,因为它们位于单独的线程上。

解决方案似乎是使用 Control.Invoke,但是,我有太多 UI 操作要执行,所以我担心我可能没有选择正确的路径。

我应该做什么?

  • 选项 A:无论如何坚持使用 Invoke,并使用 Invoke 对每个控件执行每个操作。

  • 选项 B:放置一个 50 毫秒的重复计时器,我每隔 50 毫秒检查 bool 值是否为 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";
}

最佳答案

我觉得你想多了。假设你在一个表单中编码,这样的事情应该有效。这是从臀部开始的,您可能需要稍微调整一下:

private void DataReceivedHandler(object sender, SerialDataReceivedEventArgs e)
{

if (this.InvokeRequired)
{
this.Invoke(new EventHandler<SerialDataReceivedEventArgs>(DataReceivedHandler), sender, e);
return;
}

// everything here runs on the UI thread, do what you like,
// and update as many UI controls as you like.

}

如您所见,您不必将每个控件访问包装在单独的 Control.Invoke 中。

关于c# - 使用 Control.Invoke 的替代方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17592985/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com