2

我被困在调试场景中,我需要帮助了解如何获得有关我的应用程序正在发生的事情的更多信息。

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

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

例外 #1:

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

例外 #2:

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

在我的应用程序中有两个直接使用 Sockets 的地方。

1) UDPClient 侦听器建立在BackgroundWorker. 只是我们在内部使用的一个小东西来监控数据库命中。

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

这两个都已经运行了一段时间,没有问题,也没有改变,所以我怀疑他们没有罪。

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

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

4

1 回答 1

3

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

  • 单击菜单项“调试”
  • 单击菜单项“例外...”
  • 打开树项“公共语言运行时异常”
  • 打开树项“系统”
  • 向下滚动到“System.ObjectDisposedException”
  • 检查其复选框“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;
    }
}
于 2015-03-25T17:34:26.560 回答