UWP BLE代码中的神秘System.ArgumentException
一旦我确定我已经检查了UWP BLE代码中的神秘System.ArgumentException,uwp,bluetooth-lowenergy,Uwp,Bluetooth Lowenergy,一旦我确定我已经检查了System.Devices.Aep.Bluetooth.Le.IsConnectable==trueI call DiscoveredBluetoothLEDevice = await BluetoothLEDevice.FromIdAsync(DiscoveredDeviceInformation.Id); 通常情况下,这很好,我的应用程序可以订阅以接收我所追求的GATT的更新。但是,对FromIdAsync的调用通常也会失败 引发异常:System.Private.
System.Devices.Aep.Bluetooth.Le.IsConnectable==true
I call
DiscoveredBluetoothLEDevice = await BluetoothLEDevice.FromIdAsync(DiscoveredDeviceInformation.Id);
通常情况下,这很好,我的应用程序可以订阅以接收我所追求的GATT的更新。但是,对FromIdAsync
的调用通常也会失败
引发异常:System.Private.CoreLib.dll中的“System.ArgumentException”值不在预期范围内 传入的
Id
是正确的,我尝试了等待BluetoothLEDevice.FromBluetoothAddressAsync
使用设备的已知蓝牙地址,但我经常遇到相同的异常
这个神秘的错误真正指的是什么潜在的问题
注意:以下是Xavier Xie的评论
您是否尝试过官方代码示例以查看是否仍然面临此问题
我有。要重新创建错误,我在Scenario2\u客户端的第119行放置了一个断点。连接按钮\u单击
,即
bluetoothLeDevice = await BluetoothLEDevice.FromIdAsync(rootPage.SelectedBleDeviceId);
if (bluetoothLeDevice == null)
第一次运行示例时,一切正常,但是如果我在到达断点时重新启动,那么(在第二次运行中),我没有到达断点,因为我在前一行中抛出了错误。您是否正确地关闭/处理了Bluetooth设备 我确信@Martin Zikmund的评论实际上是这里的正确答案 也就是说,您需要正确地处理BluetoothLEDevice对象。有时当您重新启动GC时,它已经收集到数据,有时它没有收集到数据,因此会出现间歇性错误 要修复此问题,请按照Martin的建议使用using块,或者手动确保在退出应用程序之前已处置BluetoothLEDevice并清除对它的任何引用。e、 g
using (BluetoothLEDevice btd = BluetoothLEDevice.FromIdAsync(...))
{
// btd will be disposed when out of scope...
}
或
这个神秘的错误真正指的是什么潜在的问题
这个错误很神秘,但我相信它是说id无效(超出范围),因为它已经在使用中,这是对设备的引用存在,因此您无法再次连接
顺便说一句,如果不正确处理串行端口等,也会得到同样的结果。如果您使用相同的设备、设置等重新启动调试—可能GC已经清理完毕,并且可以正常工作—或者可能还没有清理完毕—您将收到一个错误,因为端口正在使用中
课程是始终正确关闭/处置流、端口、设备、文件等。对实现IDisposable的对象执行此操作的最佳方法可能是通过“使用”语句语法,因为您不必记得做任何额外的操作。您是否尝试过查看您是否仍然面临此问题?需要一段时间才能让示例显示相同的错误@XavierXie MSFT,但我现在抛出了错误,我已编辑了问题以显示这一点。@XavierXie MSFT另一个(可能突出)点。看起来交换应用程序可以解决问题。如果我强制将官方代码示例输入System.ArgumentException错误,然后运行我的应用程序修复问题,如果我强制将我的应用程序输入System.ArgumentException错误,则运行官方示例应用程序修复问题。操作系统是否可能与某个应用程序保持陈旧连接(即使应用程序重新启动),而交换应用程序会清除该连接?您是否阅读了此内容?您是否尝试使用块将
bluetoothLeDevice
检索包装到中?该类实现了IDisposable
,因此可能会有所帮助。
bluetoothLeDevice.Dispose();
bluetoothLeDevice = null;
// You can also force garbage collection
GC.Collect();