.net – 无法访问已处理的对象 – 如何解决?

前端之家收集整理的这篇文章主要介绍了.net – 无法访问已处理的对象 – 如何解决?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在VB.NET WinForms项目中,我收到一个异常

Cannot access a disposed object

关闭表单时。它很少发生,我无法根据需要重新创建它。堆栈跟踪如下所示:

Cannot access a disposed object. Object name: 'dbiSchedule'.
  at System.Windows.Forms.Control.CreateHandle()
  at System.Windows.Forms.Control.get_Handle()
  at System.Windows.Forms.Control.PointToScreen(Point p)
  at Dbi.WinControl.Schedule.dbiSchedule.a(Boolean A_0)
  at Dbi.WinControl.Schedule.dbiSchedule.a(Object A_0,EventArgs A_1)
  at System.Windows.Forms.Timer.OnTick(EventArgs e)
  at System.Windows.Forms.Timer.TimerNativeWindow.WndProc(Message& m)
  at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)

dbiSchedule是来自Dbi-tech的计划控制。表单上有一个计时器每隔几分钟更新屏幕上的日程表。

任何想法是什么导致异常以及我如何去修复它?甚至可以根据需要重新创建它?

嘿!感谢所有的答案。我们在FormClosing事件上停止计时器,我们会在计时器组件中检查IsDisposed属性,然后在Timer Tick事件中使用它,但不能帮助。

这是一个非常烦人的问题,因为如果有人提出了一个有效的解决方案 – 我无法确认解决方案,因为我无法手动重新创建问题。

在访问控件之前,请尝试检查 IsDisposed属性。假设您使用FormClosed事件,您也可以在 FormClosing事件中检查它。

We do stop the Timer on the
FormClosing event and we do check the
IsDisposed property on the schedule
component before using it in the Timer
Tick event but it doesn’t help.

在检查IsDisposed之前调用GC.Collect可能有所帮助,但要小心。阅读Rico Mariani“When to call GC.Collect()”这篇文章

猜你在找的VB相关文章