C# 无法确定应用程序关闭期间System.ObjectDisposedException的原因
我被困在调试场景中,我需要帮助了解如何获得有关我的应用程序发生了什么的更多信息 异常在我关闭主窗体时抛出,似乎是在完全关闭之前的最后一点处理期间 我得到了以下两个例外中的一个,没有明显的原因来解释其中一个。我可以简单地打开应用程序并立即关闭它。将生成其中一个。如果有问题的话,可能是#2更可能出现在我关注另一个正在运行的应用程序,返回到我的应用程序,然后关闭它的情况下 例外情况#1: 无法访问已处置的对象。C# 无法确定应用程序关闭期间System.ObjectDisposedException的原因,c#,objectdisposedexception,system.net.sockets,C#,Objectdisposedexception,System.net.sockets,我被困在调试场景中,我需要帮助了解如何获得有关我的应用程序发生了什么的更多信息 异常在我关闭主窗体时抛出,似乎是在完全关闭之前的最后一点处理期间 我得到了以下两个例外中的一个,没有明显的原因来解释其中一个。我可以简单地打开应用程序并立即关闭它。将生成其中一个。如果有问题的话,可能是#2更可能出现在我关注另一个正在运行的应用程序,返回到我的应用程序,然后关闭它的情况下 例外情况#1: 无法访问已处置的对象。 对象名称:“System.Net.Sockets.NetworkStream”。 位于Sy
对象名称:“System.Net.Sockets.NetworkStream”。
位于System.Net.Sockets.NetworkStream.Write(字节[]缓冲区,Int32偏移量,Int32大小) 例外情况#2: 安全手柄已关闭
System.Net.UnsafeNclNativeMethods.OSSOCK.WSAEventSelect(SafeCloseSocket socketHandle、IntPtr事件、AsyncEventBits NetworkEvents) 在我的应用程序中,套接字有两种直接用途 1) UDPClient侦听器是在
BackgroundWorker
上建立的。这只是我们内部用来监视数据库点击的一个小东西
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;
}
}
HttpWebRequest的流是否在WebRequest之前处理?在我看来,您可以使用streamwriter并处理它(也处理底层流)与@csharpie一致。我猜会有一个事件处理程序使用已处置对象的所有者,即在应用程序开始关闭之后。检查异常调用堆栈,或添加跟踪输出以查看应用程序关闭时发生的情况。另一种可能是,您的后台工作程序仍在应用程序exist上运行,并且当您有未完成的异步接收挂起时,其
套接字
已关闭。您可以对其他异常类型执行类似操作。找出它们被抛出的位置,如果可以的话修复问题。如果无法修复,则记录并处理。重新抛出无法恢复的内容。抛出此异常时,它会中断,但不会告诉异常发生的位置