在应用程序关闭期间无法确定System.ObjectDisposedException的原因

时间:2013-10-30 19:40:53

标签: c# objectdisposedexception system.net.sockets

我陷入了调试场景,我需要帮助了解如何获取有关应用程序发生情况的更多信息。

当我关闭主窗体时,抛出异常,似乎是在完全关闭之前的最后一段处理过程中。

我得到以下两个例外中的一个,没有明显的理由为什么这一个或另一个。我可以简单地打开应用程序并立即关闭它。将生成其中一个。如果有一个问题,那么如果我关注另一个正在运行的应用程序,返回我的,然后关闭它,那么#2似乎更有可能。

例外#1:

  

无法访问已处置的对象   对象名:'System.Net.Sockets.NetworkStream'。
  在System.Net.Sockets.NetworkStream.Write(Byte []缓冲区,Int32偏移量,Int32大小)

例外#2:

  

安全手柄已关闭
  System.Net.UnsafeNclNativeMethods.OSSOCK.WSAEventSelect(SafeCloseSocket socketHandle,IntPtr Event,AsyncEventBits NetworkEvents)

我的应用程序中有两种直接使用套接字的方法。

1)在BackgroundWorker上建立UDPClient侦听器。我们在内部使用一点来监控数据库命中。

2)HttpWebRequest呼叫我们的网站并获取一些信息。

这些都已经发挥了一段时间没有问题,没有被改变,所以我怀疑他们没有罪。

因为这是一个客户端 - 服务器数据库应用程序,所以有很多网络流量正在进行,并且数据库引擎可能就是这种情况发生的地方。我只是不知道,而且我需要帮助。

数据包/流量嗅探器?在Visual Studio中进行设置/设置以获得有关异常的更好信息?你会如何追踪这个?

1 个答案:

答案 0 :(得分:1)

我假设你使用VisualStudio作为调试环境。

  • 点击菜单项"调试"
  • 点击菜单项"例外..."
  • 打开树项"公共语言运行时例外"
  • 打开树项"系统"
  • 向下滚动到" System.ObjectDisposedException"
  • 检查其CheckBox是否为" Thrown"
  • 点击"确定"

现在,当你进行调试时,它会在抛出异常时中断,即使你没有在任何地方专门捕获它。

在适当的代码块周围添加try...catch并处理这个常见的异常,通常不是真正的异常,而是正常的代码流事件。

示例:

void OnReceiveFrom(IAsyncObject ar)
{
    try
    {
        // whatever you do
    }
    catch (ObjectDisposedException obex)
    {
        // log to debugging output window, just so you will know.
        Debug.WriteLine(String.Format("{0}: {1}: in OnRecieveFrom",
            obex.GetType().Name, obex.Message));
        // test some variable you set when your application is exiting.
        if (applicationIsShuttingDown)
            return;
        // but if it is unexpected, then re-throw it.
        throw;
    }
}