为什么异步C#套接字代码中的异常在没有堆栈跟踪的情况下终止程序?

时间:2012-09-11 21:11:25

标签: c# sockets asynchronous

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

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

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

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

SocketException
输出面板中的

消息。

如果异常沉默这样但仍然在没有堆栈跟踪的情况下崩溃我的程序,我该如何找到抛出异常的位置?

1 个答案:

答案 0 :(得分:2)

嗯,这取决于您使用的.NET版本。但是,这通常会记录下来的事情。

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

就像BeginSend这样的方法而言,BeginSend(或BeginAccept的方法)实际上是线程入口点。 e.g。

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

private static void OnAccept(IAsyncResult ar)
{
    try {
        var tcpClient = listener.EndAcceptTcpClient(ar);
        //...
    } catch(Exception ex)
    {
        Dump(ex);
        return;
    }
}