开发者

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开发者_JAVA技巧 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);
   }
}


The UI elements can only be accessed by the UI thread. WinForms and WPF/Silverlight doesn't allow access to controls from multiple threads.

A work-around to this limitation can be found here.


 private void Form1_Load(object sender, EventArgs e)
    {
        CheckForIllegalCrossThreadCalls = false;
    }

Maybe this will work.


You need to call method Invoke from non-UI threads to perform some actions on form and other controls.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜