如何停止调用导致IAsyncOperation?

在我的应用程序中,我通知多个设备 如果设备无法访问且几秒钟内没有响应,我想取消呼叫。

我的代码是:
await characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync (GattClientCharacteristicConfigurationDescriptorValue.Notify);

经过一些研究后我发现通常可以传递CancelationToken(_ct)并执行此操作:

首先创建一个包含调用的操作:
IAsyncOperation operation = characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync (GattClientCharacteristicConfigurationDescriptorValue.Notify);

然后使用CancellationToken创建任务:
Task task = operation.AsTask(_ct);

然后等待它:
GattCommunicationStatus status = await task;

现在,即使CancellationTokenIsCancellationRequested -Property设置为true,也是如此。 电话不会停止。
并且,设备在第一行之后已经通知 ! 是不是应该在await之后发生?

我是否在使用令牌时犯了错误,或者这是一个更大的问题?

编辑
在与@Andrii Litvinov交谈之后,我将更多代码添加到我对问题的初步描述中。 这是整个方法:

 public async Task 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 operation = characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify); Task 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; } } 

基于您正在做的文档 :

 try { ... IAsyncOperation operation = characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync( GattClientCharacteristicConfigurationDescriptorValue.Notify); return await operation.AsTask(_ct); ... } ... 

此代码应注册到令牌并调用operation.Cancel()后面的场景。

您是否可以将令牌设置为较低的值以查看操作是否实际取消? 通常需要多长时间才能执行该方法?

尝试:

 CancellationTokenSource cts = new CancellationTokenSource(10); await NotifyDevice(BLEDevice, cts.Token); 

甚至更低的价值。