I have the following code in my worker thread (ImageListView
below is derived from Control
):
if (mImageListView != null &&
mImageListView.IsHandleCreated &&
!mImageListView.IsDisposed)
{
if (mImageListView.InvokeRequired)
mImageListView.Invoke(
new RefreshDelegateInternal(mImageListView.RefreshInternal));
else
mImageListView.RefreshInternal();
}
However, I get an ObjectDisposedException
sometimes with the Invoke
method above. It appears that the control can be disposed between the time I check IsDisposed
and I call Invoke
. How can I avoid that?
You could use mutexes.
Somewhere at the start of the thread :
Then :
And whereever it is you are disposing of mImageListView :
This should ensure you cant dispose and invoke at the same time.
The solution proposed by Isak Savo
works in C# 4.0 but for some reasons it fails in C#3.0 (the exception is raised anyway)
So I used another solution based on a flag indicating if the form is closing and consequently preventing the use of invoke if the flag is set
This has the advantage of completely avoiding the use of try/catch.