我怎么知道我的代码中是什么触发了这个' System.ObjectDisposedException?

时间:2014-11-17 20:10:03

标签: c# .net exception

我正在调试和增强一个C#/ XAML程序,它在运行时反复生成异常,我可以看到它在Output窗口中看到。

类型' System.ObjectDisposedException'的第一次机会异常发生在System.dll

类型' System.ObjectDisposedException'的第一次机会异常发生在System.dll

(由于某种原因,它们似乎成对出现)程序本身在异常发生后继续运行。

该程序由一些XAML / C#代码隐藏组成,它构成.Net DLL中调用库的前端和测试工具,这也是我们的C#代码的一部分。
总代码库(前端和DLL)是大约100K行的C#源代码代码,分布在大约25个文件中。它主要在一个线程中运行,除了在socket数据处理程序中运行的代码,当数据从外部硬件设备到达时,系统调用该代码(该程序运行工厂制造过程)。

如何缩小/追踪我的代码中的哪个或哪些内容会触发这些异常?

2 个答案:

答案 0 :(得分:4)

在Visual Studio中,您可以在抛出异常时中断执行。转到调试菜单 - >例外 - >公共语言运行时异常 - >系统 - > System.ObjectDisposedException并选中“Thrown”复选框。

答案 1 :(得分:2)

此异常表示尝试在.Dispose()-ed之后访问对象。程序继续运行的原因是处理异常。抛出异常时始终会生成First-Chance异常,即使它是使用catch语句处理的。

一般来说,许多这样的第一次机会异常都不值得担心。如果要跟踪它们,则需要附加第一次机会异常处理程序,然后使用StackTrace属性来查找它们。假设您的Main函数位于Program,则以下代码应该可以正常工作

static Program()
{
    AppDomain.CurrentDomain.FirstChanceException += (sender, e) =>
    { // Breakpoint here
    };
}

这样,您就可以通过e.Exception

访问例外