在 Winforms 中,
我有一个非 GUI 线程来监听传入的 UDP 消息。
当它接收到消息时,它会通过调用表单的方法之一来更新表单上的各种 UI 组件。
这显然是一种竞争条件。
似乎我想InvokeIfRequired
在每个组件上使用某种模式。
我是否可以只获得一个锁,而不是用InvokeIfRequired
人们似乎建议的数百个这样的条件和 lambda 来编写我的代码?我可以围绕对表单的单个调用引入线程安全调整,而不必修改表单代码的内部结构吗?
我正在运行的线程看起来像这样:
private static void HandleMessages(frmGui gui)
{
while(true){
if (/*udp message found*/){
gui.UpdateLotsOfGuiComponents();
}
}
}
表格看起来像这样:
public partial class frmGui : Form
{
public void UpdateLotsOfGuiComponents()
{
//lots of UI changes through a large call stack
}
}
我希望只是在我的电话周围加上一些东西
gui.UpdateLotsOfGuiComponents();
。