我正在运行 Windows 版本 10.0.16299.0,并在 Visual Studio C# 2017 上构建。我可以从 Windows 窗体应用程序成功连接到未配对的 BLE 设备,并获取 ValueChanged 事件(每秒 1 个),但时间不长。我通常会在 40 秒或更短的时间内停止接收这些事件——通常更少。
我意识到这可能是一个处置/GC问题,但我不知道如何。设备、服务、特征和描述符都作为成员变量存储在主窗体中,不应被收集:
public partial class Form1 : Form
{
private BluetoothLEDevice _device;
private List<GattDeviceService> _services;
private List<GattDescriptor> _descriptors = new List<GattDescriptor>();
private List<GattCharacteristic> _characteristics = new List<GattCharacteristic>();
private async void button1_Click(object sender, EventArgs e)
{
_device = await BluetoothLEDevice.FromIdAsync("BluetoothLE#BluetoothLE00:xx:xx:xx:xx:xx:xx:xx:xx:xx");
var services = await _device.GetGattServicesAsync();
foreach (var service in services.Services)
{
var chars = await service.GetCharacteristicsAsync();
foreach (var ch in chars.Characteristics)
{
var descriptors = await ch.GetDescriptorsAsync();
foreach (var desc in descriptors.Descriptors)
{
if (desc.AttributeHandle == 15 || desc.AttributeHandle == 26)
{
_services.Add(service);
_descriptors.Add(desc);
_characteristics.Add(ch);
var writer = new DataWriter();
writer.WriteBytes(new byte[] { 1, 0 });
var buf = writer.DetachBuffer();
await desc.WriteValueAsync(buf);
}
ch.ValueChanged += ChOnValueChanged;
}
}
}
}
在我的示例中,我单击一个按钮来建立连接并订阅事件。在你说写描述符之前你不会这样做 - 我知道。该设备使用非标准描述符 ID,这就是我必须直接写入它们的原因。
请注意,一切正常,包括写入 - 我没有收到任何错误。只是在短时间内不再触发 ValueChanged 事件,我不知道我还必须“缓存”什么以防止对象被处置,假设这就是问题所在。