ObjectDisposedException - 无法访问已处置的对象

时间:2016-01-20 01:39:52

标签: c# wpf objectdisposedexception hp-trim

我的WPF Windows C#应用程序存在一些问题。每当应用程序关闭时,它都会抛出System.ObjectDisposedException。问题似乎只发生在32位编译时。 64位版本运行正常,没有任何异常。

从异常消息中,它表示无法访问已处置的对象,但它似乎没有告诉导致问题的对象 - 如何找出已处置的对象?

  

异常:抛出:"无法访问已处置的对象。" (System.ObjectDisposedException)   抛出了System.ObjectDisposedException:"无法访问已处置的对象。"   时间:2016年1月19日下午5:16:28   螺纹:[1552]

     

异常信息:System.ObjectDisposedException   堆:      在System.Diagnostics.EventLogInternal.OpenForWrite(System.String)      在System.Diagnostics.EventLogInternal.InternalWriteEvent(UInt32,UInt16,System.Diagnostics.EventLogEntryType,System.String [],Byte [],System.String)      在System.Diagnostics.EventLogInternal.WriteEntry(System.String,System.Diagnostics.EventLogEntryType,Int32,Int16,Byte [])      在System.Diagnostics.EventLog.WriteEntry(System.String,System.Diagnostics.EventLogEntryType)      在HP.HPTRIM.SDK.TrimApplicationBase.UnregisterStackTrace(System.Object,Int32)      在HP.HPTRIM.SDK.Database.internal_Dispose()      在HP.HPTRIM.SDK.Database.Finalize()

3 个答案:

答案 0 :(得分:2)

这可能为时已晚,无法使用,但我偶然发现了这一点,因为我最近在使用HP Records Manager SDK(在我的情况下为v8.3)时遇到了一个非常相似(相同的?)问题。我相信我已经确定了原因。

我自己的代码中存在一个错误(使用HP .Net SDK连接到HPRM的可执行文件),我没有在其中一个SDK对象上调用Dispose()

似乎当GC随着可执行文件退出而清理时,HP决定要将消息写入Windows应用程序事件日志,指出开发人员忘记了.Dispose()正确的对象。但无论出于何种原因,HP SDK中似乎也存在一个错误,此时它已经处理了内部系统以写入事件日志。 (有时它适用于我,有时不适用。可能是SDK中某处的竞争条件。)

结果是,在我的代码结束后,.Net Framework跳了起来,尖叫着HP SDK尝试使用已处置的对象写入事件日志。

我的直接修复是修复自己的代码。一旦我处理了我想要的所有对象(特别是我创建的数据库连接),事件链就没有被启动。但实际上,HP代码似乎也有问题。

答案 1 :(得分:0)

如果查看堆栈跟踪的最后一行,您将看到问题是由HP.HPTRIM.SDK.Database对象的Dispose()引起的。

答案 2 :(得分:0)

这不是一个答案,因为在评论中提供有用的时间太长了。

我在ILSpy看了EventLog课时花了一些时间。异常中最内层的方法EventLogInternal.OpenForWrite旨在在设置其中一个内部标志时显式抛出ObjectDisposedException。 (尽管你收到的ObjectDisposedException总是有可能不是专门从这一行开始的,但值得注意的是。)

private void OpenForWrite(string currentMachineName)
{
    if (this.boolFlags[256])
        throw new ObjectDisposedException(base.GetType().Name);
    ...
}

仅在调用EventLog实例的Dispose方法时才设置它正在检查的标志,这意味着EventLog实例正在主动处理。由于这是您无法控制的,这可能是HP TRIM的HP.HPTRIM.SDK.Database IDisposable实现中的错误,因为异常中列出的两个HP方法之一将保留对{{EventLog的引用。 1}}实例。

值得注意的是,触发此异常是可能的,因为HP.HPTRIM.SDK.Database实例在应用程序关闭期间没有正确处理(假设其IDisposable)并且只是被允许超出范围。作为测试,您可以尝试在应用程序关闭期间处理HP.HPTRIM.SDK.Database实例,并查看是否可以复制错误。

我不能说这与位数有什么关系。