有关后台工作者的最佳做法
本文关键字:最佳 工作者 后台 | 更新日期: 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。
但是,如果知道更多关于您具体要做的事情,恐怕我无法提供更多的帮助。