You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ClientWebSocket.ConnectAsync调用后无异常退出,求助排查解决

问题原因分析

核心问题是主线程未等待异步任务完成。你的Main方法是同步方法,调用WebSocketClient.Connect()返回了一个Task,但你既没有用await等待它完成,也没有调用.Wait()或.GetAwaiter().GetResult()阻塞主线程。这导致主线程直接执行到Console.WriteLine("Exiting")就结束了,此时ConnectAsync里的socket.ConnectAsync()还在后台执行,程序直接退出,所以看不到"Narrowing down #2"的输出,也无法捕获异步任务中可能抛出的异常。

解决办法

方案1:将Main方法改为异步(推荐,C# 7.1及以上支持)

修改Main方法为异步版本,用await等待连接任务完成:

public static async Task Main(string[] args) {
    Console.WriteLine("Starting");
    try {
        var client = await WebSocketClient.Connect(new AuthCredentials {
            id = "collidacube",
            password = "amazinggrace"
        });
    }
    catch (Exception e) {
        Console.WriteLine(e.Message);
        Console.WriteLine(e.StackTrace); // 打印堆栈信息,便于定位异常
    }

    Console.WriteLine("Exiting");
}

方案2:同步阻塞等待任务完成

如果无法使用异步Main,可以在调用时阻塞主线程等待任务完成:

public static void Main(string[] args) {
    Console.WriteLine("Starting");
    try {
        // 使用GetAwaiter().GetResult()避免AggregateException包装
        var client = WebSocketClient.Connect(new AuthCredentials {
            id = "collidacube",
            password = "amazinggrace"
        }).GetAwaiter().GetResult();
    }
    catch (Exception e) {
        Console.WriteLine(e.Message);
        Console.WriteLine(e.StackTrace);
    }

    Console.WriteLine("Exiting");
}
额外建议
  • 处理异步任务时务必正确等待,否则未处理的异常可能导致程序意外崩溃
  • 建议为socket.ConnectAsync()添加CancellationToken,避免因网络问题导致无限等待
  • 修改后如果仍无法连接,可以捕获更详细的异常信息(如堆栈跟踪),进一步排查WebSocket URI或服务器端问题

内容的提问来源于stack exchange,提问作者CollidaCube

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.06 16:43:17