在我的应用程序中,我通知多个设备。如果设备无法访问并且在几秒钟内没有响应,我想取消通话。
我的代码是:
await characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync
(GattClientCharacteristicConfigurationDescriptorValue.Notify);
现在经过一些研究,我发现通常可以通过CancelationToken (_ct) 并执行以下操作:
首先创建一个包含调用的操作:
IAsyncOperation<GattCommunicationStatus> operation = characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync
(GattClientCharacteristicConfigurationDescriptorValue.Notify);
然后使用 CancellationToken 创建一个任务:
Task<GattCommunicationStatus> task = operation.AsTask(_ct);
然后等待它:
GattCommunicationStatus status = await task;
现在,即使CancellationToken的IsCancellationRequested -Property设置为 true,情况也是如此。通话不会停止。而且,设备已经在第一行之后
得到通知!这不应该在调用之后发生吗?await
我对令牌犯了错误还是这是更大的事情?
编辑
在与@Andrii Litvinov 交谈后,我在我最初对问题的描述中添加了一些代码。这是整个方法:
public async Task<GattCommunicationStatus> NotifyDevice(DeviceInformationDisplay deviceInfo, CancellationToken _ct)
{
try
{
BluetoothLEDevice device = await BluetoothLEDevice.FromIdAsync(deviceInfo.Id);
service = device.GetGattService(new Guid(Service_UUID));
characteristic0 = service.GetCharacteristics(new Guid(Characteristic_0_UUID)).First();
characteristic0.ValueChanged += characteristic0ValueChanged;
GattCommunicationStatus status = await characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
_ct.Register(() =>
{
// trying to cancel the operation somehow
});
IAsyncOperation<GattCommunicationStatus> operation = characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
Task<GattCommunicationStatus> task = operation.AsTask(_ct);
GattCommunicationStatus status_1 = await task;
if (!elapsedTimeWatcher.IsRunning)
{
elapsedTimeWatcher.Start();
}
else
{
elapsedTimeWatcher.Restart();
}
return status;
}
catch(OperationCanceledException e)
{
return GattCommunicationStatus.Unreachable;
}
catch (Exception e)
{
return GattCommunicationStatus.Unreachable;
}
}