MAUI界面创建后后台线程未正常运行问题求助
问题分析与解决方案
核心问题
你的代码存在三个关键问题,导致WebSocket连接无法正常维持:
- 未发起连接请求:创建WebSocket实例后,没有调用
Connect()方法触发连接动作。 - 实例被立即释放:使用
using块包裹WebSocket,方法执行完毕后实例被自动销毁,连接无法持续。 - 线程立即终止:后台线程执行完
OpenWebSocketConnection方法后直接结束,没有维持连接所需的阻塞逻辑。
修改后的代码
WebSocketConnection.cs
using Newtonsoft.Json; using WebSocketSharp; namespace MauiWebSocketTest { public class WebSocketConnection { private WebSocket _ws; public void OpenWebSocketConnection() { _ws = new WebSocket("ws://82.165.185.245:8081/deephub/v1/ws/socket"); _ws.OnOpen += (sender, e) => { Console.WriteLine("WebSocket连接已打开"); _ws.Send(JsonConvert.SerializeObject(new FenceEvents())); }; _ws.OnMessage += (sender, e) => { Console.WriteLine($"收到消息: {e.Data}"); }; _ws.OnError += (sender, e) => { Console.WriteLine($"WebSocket错误: {e.Message}"); }; _ws.OnClose += (sender, e) => { Console.WriteLine($"WebSocket已关闭: {e.Reason}"); }; // 阻塞线程直到连接关闭,维持连接存活 _ws.Connect(); } // 应用退出时关闭连接 public void CloseConnection() { _ws?.Close(); } } }
App.xaml.cs
namespace MauiWebSocketTest; public partial class App : Application { private WebSocketConnection _webSocket; public App() { InitializeComponent(); _webSocket = new WebSocketConnection(); Thread t = new Thread(_webSocket.OpenWebSocketConnection); t.IsBackground = true; // 设置为后台线程,不阻塞应用退出 t.Start(); MainPage = new AppShell(); } protected override void OnTerminating() { _webSocket?.CloseConnection(); base.OnTerminating(); } }
关键修改说明
- 移除
using块,将WebSocket设为类成员变量,避免实例被提前回收。 - 添加
_ws.Connect()调用,发起WebSocket连接请求,该方法会阻塞线程直到连接关闭,维持后台线程存活。 - 新增
OnError和OnClose事件,方便排查连接异常问题。 - 将WebSocketConnection实例设为App类的成员变量,防止被GC回收。
内容的提问来源于stack exchange,提问作者DaveR
相关产品推荐
相关产品推荐

