首页 / 知识
关于.net:无法访问已处置的对象-如何修复?
2023-04-13 07:57:00

Cannot access a disposed object - How to fix?在VB.NET WinForms项目中,出现异常
关闭表单时。 它很少发生,我无法按需重新创建。 堆栈跟踪如下所示:
dbiSchedule是Dbi-tech的日程表控件。 表单上有一个计时器,每隔几分钟就会更新屏幕上的时间表。 有什么想法导致异常以及如何解决该异常? 甚至只是能够按需重新创建它? 喂 感谢所有的答案。 我们确实在FormClosing事件上停止了Timer,并且确实在Schedule Tick事件中使用它之前检查了计划组件上的IsDisposed属性,但这无济于事。 这是一个非常烦人的问题,因为如果有人确实提出了可行的解决方案-我将无法确认解决方案,因为我无法手动重现该问题。 在访问控件之前,请尝试检查IsDisposed属性。如果您使用的是FormClosed事件,也可以在FormClosing事件中检查它。
在检查IsDisposed之前调用GC.Collect可能会有所帮助,但是请谨慎使用。阅读Rico Mariani的这篇文章"何时调用GC.Collect()"。
它看起来像一个线程问题。 解决方法:在计时器线程中,调用控件上的方法/属性之前,请执行以下检查:
或在处置对象之前停止计时器线程。 我遇到了同样的问题,并使用了一个布尔标志来解决该问题,该标志在表单关闭时被设置(System.Timers.Timer没有IsDisposed属性)。在启动计时器的表格上的任何地方,我都检查了此标志。如果已设置,则不要启动计时器。原因如下: 原因: 我在表单关闭事件中停止并处理计时器。我在Timer_Elapsed()事件中启动了计时器。如果要在Timer_Elapsed()事件的中间关闭窗体,则计时器将立即被Form_Closing()事件处理。这将发生在Timer_Elapsed()事件完成之前,更重要的是,在到达以下代码行之前:
一旦执行了该行,就会抛出ObjectDisposedException()与您提到的错误。 解决方案:
这是计时器经过的事件:
有趣的事情是,即使尝试启动计时器时它会抛出ObjectDisposedException,但即使窗体关闭,计时器仍会启动,导致其运行(线程仅在应用程序关闭时才会停止)。 停止计时器并不意味着不会再次调用它,具体取决于您何时停止计时器,timer_tick可能仍在表单的消息循环中排队。将会发生的事情是,您将得到一个您可能没有想到的刻度。您可以做的是在timer_tick中,在执行Timer_Tick方法之前检查计时器的Enabled属性。
如果我了解该堆栈跟踪,这不是您的计时器引起的问题,而是控件本身中的一个问题-可能是他们没有正确清理。 您是否明确要求在他们的控制权上处置? 如果这种情况偶尔发生,那么我的猜测是它与计时器有关。 我正在猜测(这只是一个猜测,因为我无法访问您的代码)关闭表单时正在触发计时器。 dbiSchedule对象已被处置,但计时器仍设法设法调用它。这不应该发生,因为如果计时器具有对schedule对象的引用,则垃圾收集器应该看到此内容,而不要处理它。 这使我问:您是否在调度对象上手动调用Dispose()?如果是这样,您是在处置计时器之前这样做吗?确保在处置它之前释放对调度对象的所有引用(即,预先处置计时器)。 现在,我意识到从您发布此消息到我回答这段时间已经过去了几个月,因此希望您已经解决了此问题。我写这篇文章是为了其他可能会在以后遇到类似问题的人的利益。 希望这可以帮助。 您可以停止计时器的另一个地方是FormClosing事件-这是在窗体实际上关闭之前发生的事件,因此是在事物可能访问不可用资源之前停止事物的好地方。 您确定计时器不会以某种方式超过" dbiSchedule",并且在处理完" dbiSchedule"之后触发吗? 在这种情况下,如果计时器触发得更快,则您可能能够更一致地重新创建它,从而增加了您在计时器触发时关闭窗体的机会。 我的解决方案是尝试一下,并且工作正常
查看错误堆栈跟踪,看来您的计时器仍处于活动状态。在关闭表单后尝试取消计时器(即在表单的OnClose()方法中)。这看起来是最干净的解决方案。 因为解决方案文件夹位于OneDrive文件夹内。 如果将解决方案文件夹移出一个驱动器文件夹,则错误会消失。 最好 |
最新内容
相关内容
用于业余项目的优秀 Python 库
用于业余项目的优秀 Python 库,数据,工具,项目,信息,培训,系统,地图,下来,工作,管理,1.在数据库中即时保存数据:Dataset当我们想要在不知道最列举Python面向对象中带双下划线的
列举Python面向对象中带双下划线的特殊方法,信息,代码,培训,对象,属性,方法,实例,字符串,里边,内容,__new__:生成实例__init__:生成实例的属性_Python 条件对象
Python 条件对象,状态,培训,对象,条件,线程,方法,底层,发生,场景,典型,条件对象总是与某种类型的锁对象相关联,锁对象可以通过传入获得,或者在Python 事件对象
Python 事件对象,通信,培训,线程,事件,对象,内部,标志,信号,机制,以上,一个线程发出事件信号,其他线程等待该信号,这是最简单的线程之间通信机Python之什么是面向对象?
Python之什么是面向对象?,设计,流程,代码,个体,大唐,对比,培训,模子,上帝,对象,OOP(ObjectOrientedPrograming)编程是利用“类”和“对象”来Python如何创建对象,有哪些方法
Python如何创建对象,有哪些方法,培训,对象,方法,内容,函数,属性,所在,以上,以下,功能,以下介绍Python创建对象的9种方法。classPoint:def__inipython类对象和实例对象是一样的吗
python类对象和实例对象是一样的吗,地址,概念,下来,数据,培训,实例,对象,方法,属性,变量,python面向对象最重要的概念就是类(Class)和实例(Inpython中类对象和方法的区别是什么
python中类对象和方法的区别是什么,地址,数据,培训,对象,函数,类型,字符串,方法,表示,身份,python使用对象模型来存储数据,也就是说构造任何类python如何打印一个对象的全部属性
python如何打印一个对象的全部属性,代码,公用,情况,培训,属性,对象,字典,全部,方法,动态,python打印对象的全部属性,可以使用__dict__方法。遇python怎么打包整个项目
python怎么打包整个项目,环境,标准,项目,培训,工作,工具,脚本,状况,以上,版本,distutils-Python自带的基本安装工具,适用于非常简单的应用场python对象与方法的区别是什么
python对象与方法的区别是什么,地址,数据,培训,对象,函数,类型,字符串,方法,表示,身份,python使用对象模型来存储数据,也就是说构造任何类型的python如何实例化一个对象
python如何实例化一个对象,培训,名称,实例,括号,关键字,对象,函数,字母,方式,以上,python中同样使用关键字class创建一个类,类名称第一个字母