I was testing a program I am writing and I got this error message: Cross-thread operation not valid: Control 'lblStatus' accessed from a thread other than the thread it was created on
The code is a bit massive and I am not sure which part is causing this error to post a smaller segment. However here is some info that might be of use.
I am not using any "threading" explicitly. I am guessing something else is automatically creating multiple threads - I am using a Wii remote hardware access library and I am doing graphics manipulation.
The stack trace indicates, that a call is made to an on change event handler, which calls a function inside which lblStatus is tried to be modified - but fails.
I was wondering how do you debug these types of errors. I am using Visual Studio 2008.
EDIT
One thing I want to clarify, I do not know how this different thread even came up. How would I even find this? the source of the different thread.
public void SetStatus(string msg)
{
if (lblStatus.InvokeRequired)
lblStatus.Invoke(new MethodInvoker(delegate
{
lblStatus.Text = msg;
}));
else
lblStatus.Text = msg;
}
This will get your label text updated.
For a BeginInvoke, this is the way I know (I know there are more elegant implementations) - but I haven't tried this in a multi-threaded app yet:
Action<string> setStatus= target.AppendText;
void OnSomeEvent (object sender, EventArgs e)
{
IAsyncRes iares = setStatus.BeginInvoke("status message", null, null);
setStatus.EndInvoke(iares);
}
public void SetStatus(string msg)
{ lblStatus.Text = msg; }
For the different methods of synchronizing to the control thread, SnOrfus references an excellent link. My example above on BeginInvoke is not correct for synchronizing to the control's thread.
As far as what is causing the thread: About WiimoteChanged event
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With