Accessing a form's control from a separate thread

I'm practising on threading and came across this problem. The situation is like this:

  1. I have 4 progress bars on a single form, one for downloading a file, one for showing the page loading status etc...

  2. 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);
   }
}