System.ObjectDisposedException в WriteClientCharacteristicConfigurationDescriptorAsync - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь ускорить некоторый код Bluetooth UWP, который я написал для подключения к устройству O6 . Вот некоторые типичные временные измерения:

// 20ms
DiscoveredGattDeviceService = DiscoveredBluetoothLEDevice.GetGattService(gattServiceGuid);

// 4,284ms
result = await DiscoveredBluetoothLEDevice.GetGattServicesForUuidAsync(gattServiceGuid, BluetoothCacheMode.Uncached);

// 444ms
result = await DiscoveredBluetoothLEDevice.GetGattServicesForUuidAsync(gattServiceGuid, BluetoothCacheMode.Cached);

(N.B. Самый быстрый отмечен как устаревший.)

Из этих рисунков кажется очевидным, что я должен выбрать последний метод, он намного быстрее, чем некэшированный вызов, и не помечен как устаревший. Но если я выберу один из двух более быстрых вызовов, я столкнусь с проблемой позже в моем коде с моим вызовом GattCharacteristic.WriteClientCharacteristicConfigurationDescriptorAsync, который выдает исключение

System.ObjectDisposedException

Очевидно, я пытался сделать все в поле зрения статичным, но это что-то вне моего контроля.

Я получаю GattCharacteristic, используя этот код

var accessStatus = await DiscoveredGattDeviceService.RequestAccessAsync();

, а затем

var result = await DiscoveredGattDeviceService.GetCharacteristicsAsync(BluetoothCacheMode.Uncached);

и для ошибки не имеет значения, использую ли я BluetoothCacheMode.Uncached или BluetoothCacheMode.Cached в этом вызове GetCharacteristicsAsync

Чего мне не хватает? Как я могу использовать GetGattServicesForUuidAsync с BluetoothCacheMode.Cached и оказаться в состоянии, в котором я могу подписаться на характеристику GATT?

1 Ответ

0 голосов
/ 07 мая 2018

System.ObjectDisposedException

Исключение, которое генерируется при выполнении операции с удаленным объектом. ObjectDisposedException

где, как вы вызываете этот метод

public IAsyncOperation<GattCommunicationStatus> WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue clientCharacteristicConfigurationDescriptorValue)

где аргумент GattClientCharacteristicConfigurationDescriptorValue
Определяет новое значение для ClientCharacteristicConfigurationDescriptor этого объекта Характеристика. И как его перечисление, которые имеют три существующих поля. GattClientCharacteristicConfigurationDescriptor Значения полей.

во время передачи перечисления BluetoothCacheMode (указывает, должны ли определенные методы Bluetooth API работать со значениями, кэшированными в системе, или извлекать эти значения с устройства Bluetooth), который имеет только два поля. поля BluetoothCacheMode .

Пожалуйста, обоснуйте свой код и отладьте значение аргумента appopriate для метода, который возвращает объект, управляющий асинхронной операцией, которая после завершения возвращает состояние, с которым операция завершилась.

Как вы можете использовать этот метод

public IAsyncOperation<GattDeviceServicesResult> GetGattServicesForUuidAsync(Guid serviceUuid, BluetoothCacheMode cacheMode)

, который возвращает GattDeviceServices для устройства Bluetooth LowEnergy с указанным UUID.

...