You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:32:00