I am making my first ever C# GUI. It is using a BackgroundWorker to run a computationally heavy simulation. Periodically, the simulation reports (through the ProgressChanged event) a sizable body of information that needs to be displayed in the GUI.
The GUI is divided into controls and I want each control to know how to ‘update itself’.
In my research, I found lots of ways I might be able to do this.
- I could think of was to have the method bougnd to
ProgressChangedcall an update method on each part of the GUI. - I could
Invalidatethe GUI and bind each controls update method to theValidatingevent. - I could bind each control’s update method to the
ProgressChangedevent. - I could have each control implement the
INotifyPropertyChangedinterface (but I’m skeptical that this would work)
Of all of these options, which one is best practices for updating the entire GUI upon the ProgressChanged event? (or am I out in left field?)
From comment:
private void backgroundWorker_DoWork(object sender, DoWorkEventArgs e)
{
Simulation simulation = new Simulation();
while(true)
{
simulation.RunIteration();
backgroundWorker.ReportProgress(-1, simulation);
}
}
You should not have to do anything special.
Your ProgressChanged handler can ‘unpack’ the data and set the relevant properties of controls. Invalidation and repainting is automatic and it runs on the GUI thread.
You should only be careful with updating ‘too often’. How often is too often depends on the volume of data, the handler should be finished well before the next update. If not, build in some throttling mechanism.