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
相关产品推荐
相关产品推荐

