C# 如何在没有耦合的情况下从其他线程访问MainForm上的控件?
在Winforms应用程序中,我的主窗体上几乎没有控件。例如,更新每个操作进度的控件。这些操作是在不同线程中运行的类C# 如何在没有耦合的情况下从其他线程访问MainForm上的控件?,c#,.net,multithreading,C#,.net,Multithreading,在Winforms应用程序中,我的主窗体上几乎没有控件。例如,更新每个操作进度的控件。这些操作是在不同线程中运行的类 如何正确更新这些控件?最好的方法是通过事件进行更新。 更简单的方法是直接改变它们 确保它们是公开的,并且你给了全班太多,然后你可以改变它 Invoke(new MethodInvoker(delegate { frmMain.label1.Text = "bla"; })); 我建议使用一个模型类,它将包含显示给用户的数据。数据将UI控件绑定到模型的属性,并从工作线程更新模型值
如何正确更新这些控件?最好的方法是通过事件进行更新。 更简单的方法是直接改变它们 确保它们是公开的,并且你给了全班太多,然后你可以改变它
Invoke(new MethodInvoker(delegate { frmMain.label1.Text = "bla"; }));
我建议使用一个模型类,它将包含显示给用户的数据。数据将UI控件绑定到模型的属性,并从工作线程更新模型值(使用适当的调用以确保更新发生在UI线程上,从而不会出现跨线程异常)在主窗体中,您可以添加这样的函数
private delegate void doSomethingWithTheControlsDelegate(object obj);
public void doSomethingWithTheControls(object obj) {
if (this.InvokeRequired) {
this.BeginInvoke(new doSomethingWithTheControlsDelegate(this.doSomethingWithTheControls), obj);
} else {
// do something
}
}
下面是解决您的问题的链接:谢谢,在这个上下文中还有什么意思?如果线程操作中有指向控件的指针,您可以调用control.dosomething和controls(progress);嗯,我确实想实现它,但不知道如何实现。如果你有一些书签/收藏夹的工作示例,我很乐意阅读。谢谢