我陷入了调试场景,需要帮助了解如何获取有关应用程序所发生情况的更多信息。
当我关闭主窗体时,似乎是在完全关闭之前的最后一点处理期间抛出异常。
我遇到以下两个异常之一,没有明显的原因为什么会出现其中一个。我可以简单地打开应用程序并立即关闭它。将生成两者之一。如果有问题的话,如果我关注另一个正在运行的应用程序,返回到我的应用程序,然后关闭它,#2 的可能性似乎更大。
异常(exception)#1:
Cannot access a disposed object.
Object name: 'System.Net.Sockets.NetworkStream'.
at System.Net.Sockets.NetworkStream.Write(Byte[] buffer, Int32 offset, Int32 size)
异常(exception)#2:
Safe handle has been closed
System.Net.UnsafeNclNativeMethods.OSSOCK.WSAEventSelect(SafeCloseSocket socketHandle, IntPtr Event, AsyncEventBits NetworkEvents)
在我的应用程序中有两种直接使用套接字的方式。
1) 在BackgroundWorker
上建立UDPClient 监听器。只是我们内部使用的一个小东西来监视数据库命中。
2) 一个 HttpWebRequest,调用我们的网站并获取一些信息。
这两者都已经运行了一段时间,没有出现问题,也没有改变,所以我怀疑他们没有罪。
因为这是一个客户端-服务器数据库应用程序,所以存在大量网络流量,并且数据库引擎可能是发生这种情况的地方。我只是不知道,我需要帮助。
数据包/流量嗅探器? Visual Studio 中的设置/设置以获得有关异常的更好信息?您将如何追踪这一点?
最佳答案
我假设您正在使用 VisualStudio 作为调试环境。
- 点击菜单项“调试”
- 点击菜单项“异常(exception)...”
- 打开树项目“公共(public)语言运行时异常”
- 打开树项目“系统”
- 向下滚动到“System.ObjectDisposeException”
- 选中其复选框“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;
}
}
关于c# - 无法确定应用程序关闭期间 System.ObjectDisposeException 的原因,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19692370/