繁体   English   中英

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

[英]Why do exceptions in asynchronous C# socket code terminate my program without stack trace?

我有一个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

输出面板中的消息。

如果异常像这样被静音但仍然在没有堆栈跟踪的情况下崩溃我的程序,我怎么能找到引发异常的地方?

嗯,这取决于您使用的.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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM