UWP HoloLens应用WiFiAdapter.ScanAsync()断连热点后异常问题
我来帮你解决这两个问题,刚好在HoloLens上做过类似的WiFi相关开发,给你一些实用的方案:
一、检测已建立的WiFi连接是否断开
你之前用高频扫描间接判断连接状态的方式效率不高,UWP提供了原生的事件监听机制,能实时感知连接状态变化,比轮询靠谱得多:
针对特定WiFi适配器监听
如果你已经拿到了目标WiFiAdapter实例,可以直接注册它的ConnectionStatusChanged事件,一旦连接状态变更就会触发:private WiFiAdapter _targetWifiAdapter; // 初始化时完成事件注册 private async Task SetupWifiConnectionMonitor() { // 先申请WiFi访问权限 var accessResult = await WiFiAdapter.RequestAccessAsync(); if (accessResult != WiFiAccessStatus.Allowed) return; // 获取设备上的WiFi适配器(这里取第一个,你可以根据实际场景筛选) var adapters = await WiFiAdapter.FindAllAdaptersAsync(); if (adapters.Count > 0) { _targetWifiAdapter = adapters[0]; _targetWifiAdapter.ConnectionStatusChanged += OnWifiConnectionStatusChanged; } } private void OnWifiConnectionStatusChanged(WiFiAdapter sender, object args) { if (sender.ConnectionStatus == WiFiConnectionStatus.Disconnected) { // 这里处理连接断开后的逻辑,比如标记状态、停止无效操作 Debug.WriteLine("WiFi连接已断开"); } else if (sender.ConnectionStatus == WiFiConnectionStatus.Connected) { Debug.WriteLine("WiFi已成功连接"); } }全局网络状态监听(更通用)
如果你不需要绑定特定适配器,可以用NetworkInformation的全局事件监听所有网络连接变化:// 初始化时注册事件 NetworkInformation.NetworkStatusChanged += OnGlobalNetworkStatusChanged; private void OnGlobalNetworkStatusChanged(object sender) { var connectedWifiExists = false; var allProfiles = NetworkInformation.GetConnectionProfiles(); foreach (var profile in allProfiles) { // 判断是否是已连接的WiFi网络 if (profile.IsWlanConnectionProfile && profile.GetNetworkConnectivityLevel() == NetworkConnectivityLevel.InternetAccess) { connectedWifiExists = true; break; } } if (!connectedWifiExists) { Debug.WriteLine("当前无可用的WiFi连接"); } }这种方式不需要持有适配器实例,适合全局感知网络状态的场景。
二、给ScanAsync()设置超时取消
WiFiAdapter.ScanAsync()本身没有内置超时参数,但我们可以用CancellationTokenSource结合Task.WhenAny实现超时控制,避免它卡住20秒才抛出异常:
private async Task<bool> PerformWifiScanWithTimeout(int timeoutMs = 5000) { using (var cts = new CancellationTokenSource(timeoutMs)) { try { // 同时等待扫描任务和超时任务 var scanTask = _targetWifiAdapter.ScanAsync().AsTask(cts.Token); var completedTask = await Task.WhenAny(scanTask, Task.Delay(timeoutMs, cts.Token)); if (completedTask == scanTask) { // 扫描正常完成,可在这里获取扫描结果 await scanTask; Debug.WriteLine("WiFi扫描完成"); return true; } else { // 触发超时,主动取消扫描任务 cts.Cancel(); Debug.WriteLine("WiFi扫描超时"); return false; } } catch (TaskCanceledException) { // 处理任务取消的异常,可忽略或记录日志 Debug.WriteLine("扫描任务被主动取消"); return false; } catch (Exception ex) { // 处理其他异常(比如你遇到的Operation aborted) Debug.WriteLine($"扫描出现异常: {ex.Message}"); return false; } } }
这里设置了5秒超时(你可以根据需求调整),如果扫描在超时时间内未完成,就主动取消任务,避免长时间阻塞。结合你的场景,建议在检测到连接断开后再触发扫描,而不是每帧都执行扫描操作——这样不仅能减少资源消耗,还能降低你遇到的“重新开热点后扫描卡顿”的概率。
内容的提问来源于stack exchange,提问作者B.B.
相关产品推荐
相关产品推荐

