我有一个非常奇怪的行为,似乎只发生在一种形式上。
基本上我正在创建一个实例Form
,并调用Show()
以非阻塞显示表单。在该表单的事件处理程序中,我有一些在某些情况下Load
可能会调用的逻辑。this.Close()
这会关闭表单,但随后Show()
客户端代码中的表单方法会抛出ObjectDisposedException
.
ObjectDisposedException 的堆栈跟踪如下:
在 System.Windows.Forms.Control.CreateHandle()
在 System.Windows.Forms.Form.CreateHandle()
在 System.Windows.Forms.Control.get_Handle()
在 System.Windows.Forms.ContainerControl.FocusActiveControlInternal()
在 System .Windows.Forms.Form.SetVisibleCore(Boolean value)
at System.Windows.Forms.Control.Show()
...等。
这就是我所看到的:
Control.Show()
叫做- 我的表格已启动
- 该
OnFormLoad
方法被调用 - 事件
FormLoad
处理程序被调用,在其中我调用this.Close()
- 该
OnFormClosing
方法被调用 - 事件
FormClosing
处理程序被调用 Dispose
在我的表单及其所有用户控件上调用
然后在接近Control.Show()
方法末尾的某个地方,它尝试获取表单的句柄,因为对象被标记为已释放,所以它吓坏了并抛出异常。
我真正的问题是,为什么我可以毫无例外地在我拥有的所有其他表格上做同样的事情?是GC问题吗?我试过在GC.Collect()
之后立即打电话this.Close()
,这没有什么区别。就像我说的,它 100% 的发生在这个表单上,从来没有发生在其他任何地方,不管子用户控件、表单变量的范围等。
有任何想法吗?