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 call this.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, and no 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?