UWP BLE代码中的Cryptic System.ArgumentException

时间:2018-02-24 14:37:22

标签: uwp bluetooth-lowenergy

一旦我确定我已经检查了System.Devices.Aep.Bluetooth.Le.IsConnectable == true我打电话

DiscoveredBluetoothLEDevice = await BluetoothLEDevice.FromIdAsync(DiscoveredDeviceInformation.Id);

这通常很好,我的应用程序可以订阅接收我所追求的GATT特征的更新。但同样经常调用FromIdAsync失败

  

抛出异常:' System.ArgumentException'在System.Private.CoreLib.dll中   价值不在预期范围内。

传入的Id是正确的,我已尝试使用设备的已知蓝牙地址await BluetoothLEDevice.FromBluetoothAddressAsync,但我经常会遇到相同的例外情况。

这个神秘错误究竟是指什么潜在问题?

N.B。以下是Xavier Xie的评论

  

您是否尝试过官方代码示例以确定是否仍然遇到此问题?

我有。要重新创建错误,我在Scenario2_Client.ConnectButton_Click的第119行放置一个断点,即

中的第二行
bluetoothLeDevice = await BluetoothLEDevice.FromIdAsync(rootPage.SelectedBleDeviceId);

if (bluetoothLeDevice == null) 

第一次运行示例时,一切都很好,但是如果我在达到断点时重新启动(第二次运行),我没有到达断点,因为我得到了前一行抛出的错误。

1 个答案:

答案 0 :(得分:1)

您是否在任何地方正确关闭/处置BluetoothLEDevice?

我确定@Martin Zikmund的评论实际上是正确答案。

那就是你需要妥善处理BluetoothLEDevice对象。有时当你重新启动时GC已收集,有时它没有 - 因此是间歇性错误。

要修复使用使用块,如Martin建议的那样,或者在退出应用程序之前手动确保已经处理了BluetoothLEDevice并清除了对它的任何引用。 e.g

using (BluetoothLEDevice btd = BluetoothLEDevice.FromIdAsync(...)) 
{
    // btd will be disposed when out of scope...
}

bluetoothLeDevice.Dispose();
bluetoothLeDevice = null;
// You can also force garbage collection
GC.Collect(); 
  

这个神秘错误究竟是指什么潜在问题?

错误很神秘,但我相信它是说id无效(超出范围),因为它已经在使用,这是对设备的引用,因此您无法再次连接。< / p>

另外,如果你没有正确处理它们,你会得到与串口等相同的东西。如果您使用相同的设备,设置等重新启动调试 - 可能GC已经清理并且可以正常工作 - 或者它可能因为端口正在使用而导致错误。

课程是始终正确关闭/处理流,端口,设备,文件等。使用实现IDisposable的对象执行此操作的最佳方法可能是通过&#34;使用&#34;声明语法,因为你不必记得做任何额外的事情。