I have a very strange behavior that only seems to happen on one form.
Basically I am creating an instance of a Form
, and calling Show()
to display the form non-blocking. In that form's Load
event handler, I have some logic that may call this.Close()
under certain circumstances. This closes the form, but then the form Show()
method in the client code throws an ObjectDisposedException
.
The stack trace from the ObjectDisposedException is as follows:
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.Form.CreateHandle()
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.ContainerControl.FocusActiveControlInternal()
at System.Windows.Forms.Form.SetVisibleCore(Boolean value)
at System.Windows.Forms.Control.Show()
...etc.
This is what I'm seeing happen:
Control.Show()
is called- my form is launched
- the
OnFormLoad
method is called - the
FormLoad
event handler is called, inside of which I callthis.Close()
- the
OnFormClosing
method is called - the
FormClosing
event handler is called Dispose
is called on my form and all it's user controls
and then somewhere toward the end of the Control.Show()
method, it tries to get a handle to the form, which freaks out and throws an exception because the object is marked disposed.
My real question is, why can I do this exact same thing on every other form I have without exceptions? Is it a GC issue? I've tried putting a GC.Collect()
call right after the this.Close()
and it makes no difference. Like I said, it happens 100% of the time on this form, and never anywhere else, regardless of child user controls, scope of the form variable, etc.
Any ideas?