Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/291.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 无法确定应用程序关闭期间System.ObjectDisposedException的原因_C#_Objectdisposedexception_System.net.sockets - Fatal编程技术网

C# 无法确定应用程序关闭期间System.ObjectDisposedException的原因

C# 无法确定应用程序关闭期间System.ObjectDisposedException的原因,c#,objectdisposedexception,system.net.sockets,C#,Objectdisposedexception,System.net.sockets,我被困在调试场景中,我需要帮助了解如何获得有关我的应用程序发生了什么的更多信息 异常在我关闭主窗体时抛出,似乎是在完全关闭之前的最后一点处理期间 我得到了以下两个例外中的一个,没有明显的原因来解释其中一个。我可以简单地打开应用程序并立即关闭它。将生成其中一个。如果有问题的话,可能是#2更可能出现在我关注另一个正在运行的应用程序,返回到我的应用程序,然后关闭它的情况下 例外情况#1: 无法访问已处置的对象。 对象名称:“System.Net.Sockets.NetworkStream”。 位于Sy

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

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

我得到了以下两个例外中的一个,没有明显的原因来解释其中一个。我可以简单地打开应用程序并立即关闭它。将生成其中一个。如果有问题的话,可能是#2更可能出现在我关注另一个正在运行的应用程序,返回到我的应用程序,然后关闭它的情况下

例外情况#1:

无法访问已处置的对象。
对象名称:“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上运行,并且当您有未完成的异步接收挂起时,其
套接字
已关闭。您可以对其他异常类型执行类似操作。找出它们被抛出的位置,如果可以的话修复问题。如果无法修复,则记录并处理。重新抛出无法恢复的内容。抛出此异常时,它会中断,但不会告诉异常发生的位置