c# - BackgroundWorker 最佳实践

标签 c# user-interface user-controls backgroundworker

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

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

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

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

在所有这些选项中,哪个是根据 ProgressChanged 事件更新整个 GUI 的最佳实践? (或者我在左外野?)

来自评论:

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

最佳答案

您不必做任何特别的事情。

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

您只应注意更新“过于频繁”。多久一次取决于数据量,处理程序应该在下一次更新之前完成。如果没有,建立一些节流机制。

关于c# - BackgroundWorker 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10622385/

相关文章:

c# - 使用控件 asp.net 动态填充 <td>

c# - 什么是 MVC future 库?

c# - Html.RadioButton 将所有值设置为选定值

c# - ReactiveUI:为什么在使用 TestScheduler 时必须在 "...Throttle..."中明确指定调度程序

css - 背景颜色不会出现在列表项后面

C# WPF 无法从 UserControl 访问 ControlTemplate 中定义的按钮

user-interface - 如何访问 GTK/Gnome 上的主题字体和颜色

java - 我不知道如何在停止时显示计时器

winforms - 在 UserControl 中使用 BindingSource

c# - 在 WPF 中使用 ViewModel 创建 UserControl