从C#中的另一个线程更新UI

时间:2010-11-27 12:22:30

标签: c# multithreading thread-safety

我有一个愚蠢的问题阻止我继续我的项目。 我的项目涉及多线程(前台线程),所以我希望我的所有线程都保存在与Form1.cs不同的.cs文件中。

  

这是一个很好的电话还是我应该写的   我在Form.cs中的所有方法?在网上找到的所有例子都有同一类的方法。

我面临的问题是:如何更新Form1中的控件。 如果我把我的方法放在Form类中那将很容易,我会使用:

if(this.InvokeRequired)
this.Invoke((Action)(() => richTextBox.Text += (line + Environment.NewLine)));

但是从另一个类更新该控件会让我头疼,因为我知道我可能会错过一些相当简单的东西。

6 个答案:

答案 0 :(得分:1)

  

这是一个很好的电话,还是我应该在Form.cs中写下我的所有方法?

将应用程序逻辑与GUI分离有很多充分的理由。例如,如果要编写两个共享某些相同逻辑的不同应用程序,则可以将此逻辑放在自己的类中。它还有助于按责任(计算与用户交互)分离组件,这可以使您的设计更容易理解和测试。你的方法是合理的,虽然它确实意味着你还有一些工作要做。

  

我面临的问题是:如何更新Form1中的控件。

您可以向新班级添加事件,并在想要通知某些进度或信息时触发它们。在您的主表单中,您可以订阅这些事件并调用适当的方法来更新GUI(记住如果需要,可以调用Invoke)。

答案 1 :(得分:1)

将所有UI操作保存在Form.cs中,如:

public void UpdateText(string text)
{
    if (InvokeRequired) Invoke(() = UpdateText(text));
    else myLabel.Text = text;
}

在其他课程中,只需要保留对表单的引用,这样就可以调用on方法。

答案 2 :(得分:1)

实际更新控件的代码应该在Form.cs文件中。执行更新的确切方式取决于您希望如何调用更新。我建议查看Model-View-Controller pattern。您希望将操作的业务逻辑与表单分开,但表单应该封装用于更新这些控件的控件和逻辑。

答案 3 :(得分:1)

  

我想拥有我的所有主题   保存在不同的.cs文件中   Form1.cs中。

这个语句有点不准确,因为线程只有执行上下文,可以是Form1.cs或任何其他类文件中的代码。但是,我总是喜欢在表单中只有表单逻辑/操作代码。任何其他代码应该在其他地方。有了这个,你的其他类不应该知道你的表单 - 这会产生不必要的耦合。

使用事件或回调来调用您想要的表单响应。然后,您的表单应包含调用您的UI操作代码以在主UI线程上运行的代码。

答案 4 :(得分:0)

如果您的方法需要更新表单的控件,那么当然要继续将它们放在表单类中。我期待这就是这种情况。

答案 5 :(得分:0)

您还可以使用callback ..这样您就可以将逻辑与用户界面分开