System.ObjectDisposedException:无法访问已处置的对象 - 为什么会发生?

时间:2012-02-16 15:26:44

标签: .net vb.net winforms objectdisposedexception

我收到了堆栈跟踪错误...

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'Button'.
at System.Windows.Forms.Control.CreateHandle()
at System.Windows.Forms.Control.get_Handle()
at System.Windows.Forms.Control.PointToScreen(Point p)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)

产生此错误的代码是....

Friend Sub GoHome(ByVal sender As Form)
  InTransit = True
  sender.Close()
  fMain.Show()
End Sub

当我只是切换.show和.close方法

的顺序时,它不会出错
Friend Sub GoHome(ByVal sender As Form)
  InTransit = True
  fMain.Show()
  sender.Close()
End Sub

你能告诉我为什么第一种情况它会给出错误,为什么在第二种情况下却没有?

1 个答案:

答案 0 :(得分:0)

在这种情况下,senderfMain是同一个对象吗?

如果是这样......当您致电sender.Close时,您实际上正在调用fMain.Close,而Close方法将在幕后处置该对象。如果您随后调用fMain.Show,那么您将在刚刚处理的对象上调用它,因此会出错。

或者,或者......

也许senderfMain上的子控件之一?

您调用sender.Close,处置子控件。然后,您使用属于fMain.Show的子控件调用fMain尝试执行某事。当它尝试使用您刚处理的子控件执行特定操作时会发生错误。