我有一个C#Windows UI程序,Window1 : Window
在其构造函数中我启动了一个while (true) { /* BeginAccept */ }
的异步套接字服务器,并将数据流式传输到使用BeginSend
和{{连接的任何客户端1}}。
如果其中一个客户被强行断开连接EndSend
会引发异常(有点令人惊讶Socket.EndSend
而不是ObjectDisposedException
,但无论如何。
异常终止我的整个程序(关闭窗口)但不打印堆栈跟踪!
相反,我只会得到一个无辜的SocketException
输出面板中的消息。
如果异常沉默这样但仍然在没有堆栈跟踪的情况下崩溃我的程序,我该如何找到抛出异常的位置?
答案 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;
}
}