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

时间:2011-11-17 07:58:07

标签: c# .net multithreading

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

如何正确更新这些控件?

3 个答案:

答案 0 :(得分:1)

最好的方法是通过活动来做到这一点。 更简单的方法是直接更改它们。

确保它们是公开的并且您将它们覆盖到课堂上,然后您可以更改它

Invoke(new MethodInvoker(delegate { frmMain.label1.Text = "bla"; }));

答案 1 :(得分:1)

在主表单中,您可以添加类似这样的功能

private delegate void doSomethingWithTheControlsDelegate(object obj);

public void doSomethingWithTheControls(object obj) {
 if (this.InvokeRequired) {
   this.BeginInvoke(new doSomethingWithTheControlsDelegate(this.doSomethingWithTheControls), obj);
 } else {
   // do something
 }
}

答案 2 :(得分:0)

我建议使用一个模型类,它将包含显示给用户的数据。将UI控件数据绑定到模型的属性,并从工作线程更新模型值(使用适当的调用以确保在UI线程上进行更新,以便您不会获得跨线程异常)