0

我正在运行 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 事件,我不知道我还必须“缓存”什么以防止对象被处置,假设这就是问题所在。

4

1 回答 1

0

问题在于,由于每次迭代的嵌套,您将特征更改事件附加到多个特征。这会导致不受欢迎的行为。

最好的方法是通过 UUID 选择包含想要的特征的服务,然后从该服务中选择 UUID 的特征。

如果您坚持通过想要的描述符属性句柄进行过滤,请在附加特性更改事件之前完成所有“for each-es”。

要附加到的特征可能是 _characteristics 列表中的第一个。

于 2018-02-22T18:43:36.463 回答