[英]BLE ValueChanged stops firing in C# app
我正在運行Windows版本10.0.16299.0,並在Visual Studio C#2017上構建。我可以從Windows Forms應用程序成功連接到未配對的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事件在短時間后不再觸發,並且我想不出問題所在,我無法弄清楚我還必須“緩存”什么以防止對象被處置。
問題在於,由於嵌套了每個迭代,因此您將feature_changed_event附加到多個特征。 這會導致不必要的行為。
最好的方法是通過UUID選擇包含所需特征的服務,然后從該服務中通過UUID選擇特征。
如果您堅持要通過所需的描述符屬性句柄進行過濾,請在附加feature_changed_event之前完成所有“ for each-es”的操作。
要附加的特性可能是_characteristics列表中的第一個。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.