我正在制作我的第一个 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/