有关后台工作者的最佳做法

本文关键字:最佳 工作者 后台 | 更新日期: 2023-09-27 18:34:26

我正在制作我的第一个C#GUI。它使用BackgroundWorker来运行计算繁重的模拟。模拟会定期(通过ProgressChanged事件)报告需要在 GUI 中显示的大量信息。

GUI 分为多个控件,我希望每个控件都知道如何"自我更新"。

在我的研究中,我发现很多方法可以做到这一点。

  • 我能想到的是让方法在 GUI 的每个部分ProgressChanged调用更新方法。
  • 我可以Invalidate GUI 并将每个控件更新方法绑定到Validating事件。
  • 我可以将每个控件的更新方法绑定到 ProgressChanged 事件。
  • 我可以让每个控件实现INotifyPropertyChanged接口(但我怀疑这是否有效)

在所有这些选项中,哪一个是在ProgressChanged事件时更新整个 GUI 的最佳实践?(还是我在左边的领域?

来自评论:

private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
  Simulation simulation = new Simulation();
  while(true)
  {
    simulation.RunIteration();
    backgroundWorker.ReportProgress(-1, simulation);
  }
}

有关后台工作者的最佳做法

你不应该做任何特别的事情。

ProgressChanged 处理程序可以"解压缩"数据并设置控件的相关属性。失效和重新绘制是自动的,它在 GUI 线程上运行。

您应该只注意"过于频繁"地更新。频率取决于数据量,处理程序应在下次更新之前完成。如果没有,请构建一些限制机制。

ProgressBar 是我推荐的方法。如果要发送到 GUI 的数据是文本,则可以使用富文本框或常规文本框,并在进度条更改时向其传递文本:

public void SomeThread_ProgressChanged(object sender, ProgressChangedEventArgs e)
{
    /* Update progress bar */
    ProgressBar.Value = (e.ProgressPercentage);
    if (e.UserState != null)
    {
        TextBox.Text += (string)e.UserState;
    }
}

对于其他形式的数据,您可以包含一个 If 语句,当进度条给定某个值时,该语句执行 X。

但是,如果

知道更多关于您具体要做的事情,恐怕我无法提供更多的帮助。