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();