UWP BluetoothLEDevice缓存机制相关技术问题咨询
UWP BluetoothLEDevice 缓存相关问题解答
我之前做UWP蓝牙BLE项目的时候特意研究过这个缓存机制,查了不少内部文档还做了实测,把你关心的几个问题梳理清楚:
1. GetGattServicesAsync() 的缓存范围
默认情况下,这个方法的缓存是绑定到当前的BluetoothLEDevice实例的:
- 同一个BluetoothLEDevice实例多次调用
GetGattServicesAsync()(不带缓存参数,默认用BluetoothCacheMode.Cached),会直接返回之前缓存的结果,不会再去和设备通信。 - 如果你通过同一个蓝牙设备ID创建了多个独立的BluetoothLEDevice实例,它们的缓存是完全独立的,互相不会共享数据。
- 缓存不会跨进程共享,每个进程内的蓝牙实例都有自己的缓存空间。
2. 使用 BluetoothCacheMode.Uncached 是否会刷新缓存
是的,完全可以。当你调用BluetoothLEDevice.GetGattServicesAsync(BluetoothCacheMode.Uncached)时:
- 系统会直接跳过当前实例的缓存,重新和物理蓝牙设备建立通信,读取最新的GATT服务数据。
- 这次读取的结果会覆盖当前实例的现有缓存——也就是说,之后再调用默认的
GetGattServicesAsync()(用Cached模式),会返回这次新获取的结果,而不是之前的旧缓存。
3. 缓存是否会自动刷新
默认情况下,缓存不会自动触发刷新,分两种情况看:
- 如果首次调用
GetGattServicesAsync()因为通信异常(比如设备断开、连接超时、信号差)没有成功获取到服务,此时系统不会生成无效的缓存数据。后续再调用默认的缓存模式时,会重新尝试和设备通信,而不是直接返回之前的失败结果。 - 如果已经成功获取过服务并生成了有效缓存,之后设备的GATT服务发生变化(比如固件更新新增/移除了服务),默认的缓存模式不会自动感知并刷新,必须手动调用带
BluetoothCacheMode.Uncached参数的方法来强制更新缓存。
内容的提问来源于stack exchange,提问作者xmedeko
相关产品推荐
相关产品推荐

