Accessing a form's control from a separate thread
I'm practising on threading and came across this problem. The situation is like this:
I have 4 progress bars on a single form, one for downloading a file, one for showing the page loading status etc...
I have to control the progress of each ProgressBar from a separate thread.
The problem is I'm getting an InvalidOperationException which says
Cross-thread operation not valid: Control 'progressBar1' accessed from a thread other than the thread it was created on.
Am I wrong in this approach or can anybody tell me how to implement this?
A Control
can only be accessed within the thread that created it - the UI thread.
You would have to do something like:
Invoke(new Action(() =>
{
progressBar1.Value = newValue;
}));
The invoke method then executes the given delegate, on the UI thread.
You can check the Control.InvokeRequired flag and then use the Control.Invoke method if necessary. Control.Invoke takes a delegate so you can use the built-in Action<T>.
public void UpdateProgress(int percentComplete)
{
if (!InvokeRequired)
{
ProgressBar.Value = percentComplete;
}
else
{
Invoke(new Action<int>(UpdateProgress), percentComplete);
}
}