0

我有一个 C# Windows UI 程序,Window1 : Window在它的构造函数中我启动了一个异步套接字服务器,并将数据流式传输到使用和while (true) { /* BeginAccept */ }连接的任何客户端。BeginSendEndSend

如果其中一个客户端被强制断开连接Socket.EndSend会引发异常(有点令人惊讶的是,ObjectDisposedException而不是SocketException,但无论如何)。

该异常终止了我的整个程序(关闭窗口),但不打印堆栈跟踪!

相反,我只得到一个无辜的

A first chance exception of type 'System.ObjectDisposedException' occurred in System.dll

输出面板中的消息。

如果异常像这样被静音但仍然在没有堆栈跟踪的情况下使我的程序崩溃,我应该如何找到引发异常的位置?

4

1 回答 1

2

好吧,这取决于您使用的 .NET 版本。但是,这通常是记录在案的情况。

如果您不希望这种情况发生,请在线程入口点中使用顶级异常处理程序并“吞下”异常——在退出线程之前记录它或您想做的任何其他事情。

就诸如 之类BeginSend的方法而言,给予BeginSend(或BeginAccept就此而言)的方法实际上是线程入口点。例如

listener.BeginAcceptTcpClient(OnAccept, null);
//...

private static void OnAccept(IAsyncResult ar)
{
    try {
        var tcpClient = listener.EndAcceptTcpClient(ar);
        //...
    } catch(Exception ex)
    {
        Dump(ex);
        return;
    }
}
于 2012-09-11T21:14:26.057 回答