如何在并发执行多个异步Ping任务时,任意一个成功就立即返回结果?
internet_connection_checker 联网检测逻辑优化方案
现有代码问题
- 实际未实现并发执行:for循环中对
isHostReachable方法加了await,会等待前一个ping任务结束才启动下一个,本质为串行执行,拉长了整体检测耗时 - 无法提前返回结果:即使已经有ping任务返回成功,仍需要等待所有任务执行完成才会输出最终结果,慢响应主机会拖慢整个检测流程
优化实现
方案1:保留原Completer逻辑,改造成本最低
Future<bool> get hasConnection { final Completer<bool> result = Completer<bool>(); int remainingTasks = addresses.length; for (final addressOptions in addresses) { // 移除await,让所有ping任务同时启动 isHostReachable(addressOptions).then((request) { if (result.isCompleted) return; // 任意任务成功直接返回 if (request.isSuccess) { result.complete(true); return; } remainingTasks--; // 所有任务都失败才返回false if (remainingTasks == 0) { result.complete(false); } }); } return result.future; }
方案2:基于Dart内置Future.anyAPI,代码更简洁
Future<bool> get hasConnection async { try { await Future.any(addresses.map((options) async { final checkResult = await isHostReachable(options); if (checkResult.isSuccess) return true; // 单任务失败抛出异常,让Future.any继续等待其他任务结果 throw Exception(); })); return true; } catch (_) { // 所有任务全部失败才进入catch逻辑 return false; } }
效果说明
- 所有ping任务并发启动,无串行等待开销
- 任意一个ping任务返回成功,立刻返回
true,无需等待剩余慢响应任务 - 仅当全部主机ping失败时,才会返回
false - 提前返回后,未完成的ping任务会在执行完超时逻辑后自动销毁,无额外资源占用
内容的提问来源于stack exchange,提问作者Csaba Toth
相关产品推荐
相关产品推荐

