我正在运行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事件,我无法弄清楚我还需要什么&#34;缓存&#34;为了防止物体被丢弃,假设问题是什么。
答案 0 :(得分:0)
问题在于,由于每次迭代都嵌套,因此将characteristic_changed_event附加到多个特征。这会导致不必要的行为。
最好的方法是通过UUID选择包含所需特征的服务,然后从该服务中选择UUID的特征。
如果你坚持用想要的描述符属性句柄过滤, 完成所有&#34;为每个&#34;在附加characteristic_changed_event之前。
附加的特征可能首先出现在_characteristics列表中。