C# 如何在没有耦合的情况下从其他线程访问MainForm上的控件?

C# 如何在没有耦合的情况下从其他线程访问MainForm上的控件?,c#,.net,multithreading,C#,.net,Multithreading,在Winforms应用程序中,我的主窗体上几乎没有控件。例如,更新每个操作进度的控件。这些操作是在不同线程中运行的类 如何正确更新这些控件?最好的方法是通过事件进行更新。 更简单的方法是直接改变它们 确保它们是公开的,并且你给了全班太多,然后你可以改变它 Invoke(new MethodInvoker(delegate { frmMain.label1.Text = "bla"; })); 我建议使用一个模型类,它将包含显示给用户的数据。数据将UI控件绑定到模型的属性,并从工作线程更新模型值

在Winforms应用程序中,我的主窗体上几乎没有控件。例如,更新每个操作进度的控件。这些操作是在不同线程中运行的类


如何正确更新这些控件?

最好的方法是通过事件进行更新。 更简单的方法是直接改变它们

确保它们是公开的,并且你给了全班太多,然后你可以改变它

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);嗯,我确实想实现它,但不知道如何实现。如果你有一些书签/收藏夹的工作示例,我很乐意阅读。谢谢