为何Windows.Devices.Enumeration.DeviceInformation.FindAllAsync获取WiFi列表速度慢?
WiFi搜索慢的原因与优化方案
一、FindAllAsync(WiFiAdapter.GetDeviceSelector())速度慢的核心原因
- 枚举机制与扫描策略不匹配
这个API本质是枚举系统中的WiFi适配器设备,而非直接扫描WiFi网络。你看到的网络列表,实际是适配器后续返回的扫描结果。Windows默认采用低功耗被动扫描策略:仅等待WiFi设备主动发送的Beacon帧,而非主动触发全频段扫描,所以首次获取结果依赖Beacon帧的接收时机,信号好的网络也可能因系统延迟上报(比如为了省电合并扫描请求)导致30秒才显示。 - 首次调用的初始化开销
首次调用该API时,系统需要初始化WiFi适配器的底层接口、加载驱动关联的资源,这部分额外开销会导致2-3秒的延迟。 - 与系统开机连接的差异
系统开机时的WiFi连接是基于缓存的已知网络列表+定向快速扫描:系统优先读取已保存的网络信息,直接针对目标SSID触发定向扫描,而非全量枚举所有适配器和网络,因此速度远快于全量扫描。
二、更快的WiFi搜索/连接方案
1. 主动触发定向扫描
不要依赖系统被动扫描,拿到WiFiAdapter后主动调用ScanAsync,缩小扫描范围提升速度:
// 获取第一个可用的WiFi适配器 var adapters = await DeviceInformation.FindAllAsync(WiFiAdapter.GetDeviceSelector()); if (adapters.Any()) { var adapter = await WiFiAdapter.FromIdAsync(adapters.First().Id); // 主动触发扫描 await adapter.ScanAsync(); // 立即获取最新扫描结果 var networks = adapter.NetworkReport.AvailableNetworks; }
2. 使用DeviceInformation.CreateWatcher实时监听
相比一次性返回结果的FindAllAsync,CreateWatcher会异步监听设备/网络变化,扫描到网络时立即回调,无需等待全部结果:
var watcher = DeviceInformation.CreateWatcher(WiFiAdapter.GetDeviceSelector()); watcher.Added += (sender, args) => { // 实时处理新发现的适配器及关联网络 _ = ProcessNewAdapterAsync(args.Id); }; watcher.Start();
3. 直接连接已知网络(最优方案)
如果目标网络是已保存或已知SSID的,无需枚举所有网络,直接调用ConnectAsync:
var adapter = await GetFirstAvailableWiFiAdapter(); var credential = new PasswordCredential { Password = "your-password" }; var connectionResult = await adapter.ConnectAsync( new WiFiNetworkDisplay(knownNetwork), WiFiReconnectionKind.Automatic, credential);
这种方式会让系统直接针对目标SSID触发定向快速扫描,跳过全量枚举开销,和系统开机连接逻辑一致。
4. 读取系统缓存的网络列表
通过WiFiManager获取系统已保存的网络,优先使用缓存信息,再结合实时扫描补充:
var savedNetworks = await WiFiManager.GetSavedNetworksAsync(); // 优先从缓存中匹配目标网络,再决定是否触发实时扫描
内容的提问来源于stack exchange,提问作者tmighty
相关产品推荐
相关产品推荐

