如何自动处理Firesharp连接断开及检测Firebase连接状态?
处理Firesharp实时数据流断连自动重连及连接状态检测
Firebase实时数据库内置了连接状态监听机制,Firesharp可通过监听特定节点实现断连检测,再配合封装的重连逻辑解决OnAsync失效问题,具体方案如下:
一、检测连接断开
监听Firebase内置的/.info/connected节点,该节点值会在连接建立时变为true,断开时变为false,这是官方推荐的连接状态检测方式:
var connectedRef = client.GetReference("/.info/connected"); connectedRef.OnAsync<bool>(ChangedEventType.ValueChanged, (sender, args) => { if (!args.Value) { // 触发断连处理逻辑 HandleDisconnection(); } });
注意:此节点为只读,仅能监听其值变化,无法手动修改。
二、自动重连与数据流恢复
将数据流订阅逻辑封装为独立方法,断连时取消旧订阅并通过重试机制重新订阅,推荐使用指数退避策略避免频繁请求:
private IDisposable _dataSubscription; // 封装实时数据订阅逻辑 private void SubscribeToRealtimeData() { // 先取消原有订阅,防止内存泄漏 _dataSubscription?.Dispose(); // 重新订阅目标节点 var targetRef = client.GetReference("your-target-node-path"); _dataSubscription = targetRef.OnAsync<YourDataModel>(ChangedEventType.ValueChanged, (sender, args) => { // 处理实时数据更新 ProcessRealtimeData(args.Value); }); } // 断连后的重连处理 private void HandleDisconnection() { Task.Run(async () => { int retryCount = 0; const int maxRetries = 5; while (retryCount < maxRetries) { // 指数退避延迟:2s、4s、8s... await Task.Delay((int)Math.Pow(2, retryCount) * 1000); try { SubscribeToRealtimeData(); // 验证重连是否成功 var isConnected = await client.GetReference("/.info/connected").GetValueAsync<bool>(); if (isConnected) break; } catch (Exception ex) { // 记录错误日志 Console.WriteLine($"重连失败:{ex.Message}"); retryCount++; } } }); }
三、额外优化建议
- 回调异常捕获:在
OnAsync的回调逻辑中加入异常捕获,避免单个数据更新异常导致整个监听链路失效。 - 资源清理:在应用关闭或不再需要监听时,调用
_dataSubscription.Dispose()取消所有订阅,防止内存泄漏。 - 系统网络状态辅助:结合桌面系统的网络状态API(如Windows的
NetworkInformation类),在网络恢复时主动触发重连,作为Firebase节点监听的补充。
内容的提问来源于stack exchange,提问作者Carlos Ancona
相关产品推荐
相关产品推荐

