我陷入了调试方案,我需要帮助了解如何获取有关应用程序所发生情况的更多信息。
当我关闭主窗体时,似乎在完全关闭之前的最后一点处理期间,会引发异常。
我得到以下两个例外之一,没有明显的原因为什么其中一个。 我可以简单地打开应用程序并立即关闭它。 将生成两者之一。 如果有问题,如果我专注于另一个正在运行的应用程序,返回我的应用程序,然后关闭它,#2 似乎更有可能。
异常 #1:
无法访问已释放的对象。
对象名称:"System.Net.Sockets.NetworkStream"。
at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
异常 #2:
安全手柄已关闭
System.Net.UnsafeNclNativeMethods.OSSOCK.WSAEventSelect(SafeCloseSocket socketHandle, IntPtr Event, AsyncEventBits NetworkEvents)
在我的应用程序中,套接字有两种直接用途。
1) 在BackgroundWorker
上建立 UDPClient 侦听器。 只是我们在内部用来监视数据库命中的一个小东西。
2)一个HttpWebRequest,它调用我们的网站并获取一些信息。
这两个都已经玩了一段时间,没有问题,也没有改变,所以我怀疑他们没有罪。
由于这是一个客户端-服务器数据库应用程序,因此正在进行大量网络流量,并且数据库引擎可能是发生这种情况的地方。 我只是不知道,我需要帮助的地方。
数据包/流量嗅探器? Visual Studio 中的设置/设置以获取有关异常的更好信息? 你会如何追踪这个?
我假设你正在使用VisualStudio作为你的调试环境。
- 点击菜单项"调试"
- 单击菜单项"异常..."
- 打开树项"公共语言运行库异常"
- 打开树项"系统"
- 向下滚动到"System.ObjectDisposedException"
- 选中其复选框中的"抛出"
- 点击"确定"
引发该异常时中断,即使您没有在任何地方专门捕获它。
在适当的代码块周围添加一个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;
}
}