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

相关文章

Format[$] ( expr [ , fmt ] ) format 返回变体型 format$ 强...
VB6或者ASP 格式化时间为 MM/dd/yyyy 格式,竟然没有好的办...
在项目中添加如下代码:新建窗口来显示异常信息。 Namespace...
转了这一篇文章,原来一直想用C#做k3的插件开发,vb没有C#用...
Sub 分列() ‘以空格为分隔符,连续空格只算1个。对所选...
  窗体代码 1 Private Sub Text1_OLEDragDrop(Data As Dat...