c# - 无法确定应用程序关闭期间 System.ObjectDisposeException 的原因

标签 c# objectdisposedexception system.net.sockets

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

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

我遇到以下两个异常之一,没有明显的原因为什么会出现其中一个。我可以简单地打开应用程序并立即关闭它。将生成两者之一。如果有问题的话,如果我关注另一个正在运行的应用程序,返回到我的应用程序,然后关闭它,#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/

相关文章:

c# - 如何获取套接字中接收到的数据长度?

c# - 自定义异常是否应该有自己的 ErrorCode?

C# 使用异步加速并行网络请求

c# - C# v4.0 上的 System.ObjectDisposeException 错误

c# - ObjectDisposedException - 在 GUI 线程中运行秒表

asp.net-mvc - v下一步。 AspNet.Identity 和自定义 UserStore。 UserStore 处理异常

c# - Xamarin.Forms - 如何管理重力?

c# - 在 AWS Cognito 中调用 (Admin)InitiateAuthRequest 以获取具有范围的访问 token

c# - 为什么即使没有服务器,socket.BeginConnect()总是成功

c# - 对于最多 32 位玩家同时使用 C# 进行游戏的专用服务器,异步 TCP 网络是否是更好的选择?