我有一个非常奇怪的行为,似乎只发生在一种形式上。
基本上我正在创建一个实例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% 的发生在这个表单上,从来没有发生在其他任何地方,不管子用户控件、表单变量的范围等。
有任何想法吗?