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开发者_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.
精彩评论