簡體   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