![](/img/trans.png)
[英]Why do some native threads have a stack trace without an origin in my code?
[英]Why do exceptions in asynchronous C# socket code terminate my program without stack trace?
我有一個C#Windows UI程序,帶有一個Window1 : Window
在其構造函數中我啟動一個異步套接字服務器while (true) { /* BeginAccept */ }
並將數據流式傳輸到使用BeginSend
和EndSend
連接的任何客戶端。
如果其中一個客戶端被強行斷開連接, 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.