【问题标题】:System.ObjectDisposedExceptionSystem.ObjectDisposedException
【发布时间】:2010-11-01 12:10:46
【问题描述】:

我正在运行一些 Windows 应用程序,它工作了几天,然后停止工作,没有错误。现在我在事件查看器中发现了这个错误。也许有人知道什么会导致这个错误?

事件类型:错误

事件来源:.NET Runtime 2.0 错误报告事件

类别:无

事件 ID:5000

日期:2010 年 10 月 30 日

时间:21:58:57

用户:不适用

计算机:SERVER-PROD

描述:事件类型 clr20r3, P1 程序.exe, P2 1.0.0.0、P3 4cca7ed1、P4 mscorlib、P5 2.0.0.0、P6 4be90358、P7 1164、P8 0、P9 system.objectdisposedexception、P10 无。

【问题讨论】:

  • @SLaks:你没有得到一个带有内置错误报告的工具。
  • 我会大胆猜测一下,说您正在使用套接字,其中一个在您有待处理的异步读取并且没有错误处理包装这些读取时断开并处置。想要更好的帮助?告诉我们更多关于您的应用程序在做什么。

标签: c#


【解决方案1】:

ObjectDisposedException 是:

对已处置对象执行操作时引发的异常。 (source)

换句话说,如果一个实现 IDisposable 接口的类的实例被释放——通过调用 Dispose() 显式或隐式,例如如果它出现在 using 语句中或其他方式——任何尝试调用对象上的方法将引发上述异常。

与大多数调试问题一样,如果不实际查看代码并在调试器中运行,就很难说出是什么导致了您的问题。您说程序在运行几天后因 ObjectDisposedException 而崩溃。根据我的经验,这通常意味着以下两种情况之一:

  1. 有一些非常不寻常的代码路径,一旦被采用,总是会导致崩溃
  2. 在程序的线程之间存在race condition。因此,崩溃似乎无法预测,并且可能难以重现

我给你的建议是在调试器中启动程序,让它一直运行直到抛出异常。然后你就可以回到这里给我们提供相关的代码、堆栈跟踪、调试输出等。

【讨论】:

    【解决方案2】:

    某物正在访问已释放的对象。如果表单上有多线程,通常会发生这种情况。您启动 backgroundworker/thread/timer,然后处理表单。当后台工作者/线程/计时器尝试以某种方式更新表单时,您会收到此异常。

    【讨论】:

    • @Neil :防止这种情况的最佳方法是什么。我有一个像下面这样的警卫,它仍然在抛出异常。 this.Invoke((MethodInvoker)delegate { if (TextBox.IsDisposed == true) return; TextBox.Text = "TestForCrashOnExit"; });
    • 哪个位抛出异常?您的示例中的this 是什么?可能会处理任何this以及您的文本框,特别是如果this 是它所在的表单。
    猜你喜欢
    • 2017-03-08
    • 2020-12-08
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多