2010-11-01 67 views
4

我正在运行一些Windows应用程序,它工作了几天,然后停止工作,没有错误。现在我在事件查看器中发现了这个错误。也许任何人有任何想法可以导致这个错误?System.ObjectDisposedException

事件类型:错误

事件来源:.NET运行库2.0错误报告事件

类别:无

事件ID:5000

日期:2010年10月30日

Time:21:58:57

用户:N/A

计算机:SERVER-PROD

描述:事件类型 clr20r3,P1的Program.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 NIL。

+1

什么是堆栈跟踪? – SLaks 2010-11-01 12:11:28

+0

@SLaks:你没有得到一个内置的错误报告。 – leppie 2010-11-01 12:13:02

+2

我会大胆猜测,并说您正在使用套接字,并且其中一个已断开连接并处理,而您有未完成的异步读取并且没有错误处理来包装这些读取。想要更好的帮助?告诉我们更多关于你的应用程序在做什么。 – jgauffin 2010-11-01 12:16:00

回答

14

的ObjectDisposedException是:

时释放的对象上执行操作时所引发的异常。 (source

换句话说,如果实现IDisposable接口设置一个类的实例 - 明确地通过调用Dispose()或隐式地,例如如果它出现在一个using语句或以其它方式 - - 任何尝试调用对象上的方法都会引发上述异常。

与大多数调试问题一样,很难说没有真正查看代码并在调试器中运行它会导致您的问题。你说运行了几天之后程序崩溃了ObjectDisposedException。根据我的经验,这通常是指两种情况之一:

  1. 有一些非常不寻常的代码路径,这些措施的时候,总是会导致系统崩溃
  2. 一个race condition程序中的线程之间存在。因此,崩溃出现难以预料,并且可能难以重现

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

4

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

+0

<这个答案是 – 2015-06-23 13:46:08

+0

@ Neil:防止这种情况的最好方法是什么?我有一个像下面这样的后卫,但它仍在抛出异常。 this.Invoke((MethodInvoker)delegate if(TextBox.IsDisposed == true) return; TextBox.Text =“TestForCrashOnExit”; }); – surega 2015-09-03 10:38:11

+0

哪个位抛出异常?你的样本中的这个是什么?可能是,无论这个''是否被处置,*以及你的文本框*,特别是如果'this'是它的形式。 – 2015-09-03 11:34:00

相关问题