微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

.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()”这篇文章

原文地址:https://www.jb51.cc/vb/256169.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐