C# 如何停止导致iSyncoperation的呼叫?

C# 如何停止导致iSyncoperation的呼叫?,c#,asynchronous,bluetooth-lowenergy,iasyncoperation,C#,Asynchronous,Bluetooth Lowenergy,Iasyncoperation,在我的应用程序中,我通知多个设备。如果某个设备无法访问,并且在几秒钟内没有响应,我想取消呼叫 我的代码是: wait characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync (GattClientCharacteristicConfigurationDescriptorValue.Notify) 现在经过一些研究,我发现人们通常可以传递一个取消令牌(\u-ct)并执行以下操作: 首先创建一个包含调用的操作: IA

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

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

现在经过一些研究,我发现人们通常可以传递一个取消令牌(\u-ct)并执行以下操作:

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

然后使用CancellationToken创建任务:
Task Task=operation.AsTask(_-ct)

然后等待它:
GattCommunicationStatus=等待任务

现在,即使CancellationTokenIsCancellationRequested-属性设置为true,问题仍然存在。呼叫不会停止。
而且,设备已经在第一行之后得到通知!在调用
wait
之后不应该发生这种情况吗

我是弄错了代币还是这是一个更大的问题

编辑
在与@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;
            }

        }
public async Task NotifyDevice(设备信息显示设备信息,取消令牌)
{
尝试
{
BluetoothLEDevice设备=等待BluetoothLEDevice.FromIdAsync(deviceInfo.Id);
service=device.GetGattService(新的Guid(service_uid));
characteristic0=service.GetCharacteristics(新Guid(Characteristics_0_UUID)).First();
characteristic0.ValueChanged+=characteristic0.ValueChanged;
GattCommunicationStatus=wait characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
_ct.寄存器(()=>
{
//试图以某种方式取消操作
});
IAsyncOperation operation=characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify);
Task=operation.AsTask(_-ct);
GattCommunicationStatus状态_1=等待任务;
如果(!elapsedTimeWatcher.IsRunning)
{
elapsedTimeWatcher.Start();
}
其他的
{
elapsedTimeWatcher.Restart();
}
返回状态;
}
捕捉(操作取消异常e)
{
返回gatt通信状态。无法访问;
}
捕获(例外e)
{
返回gatt通信状态。无法访问;
}
}
基于您做得对的原因:

try
{
...

IAsyncOperation<GattCommunicationStatus> operation =
    characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync(
        GattClientCharacteristicConfigurationDescriptorValue.Notify);
return await operation.AsTask(_ct);

...
}
...
甚至更低的值。

根据您的操作正确性:

try
{
...

IAsyncOperation<GattCommunicationStatus> operation =
    characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync(
        GattClientCharacteristicConfigurationDescriptorValue.Notify);
return await operation.AsTask(_ct);

...
}
...

甚至更低的值。

取消是合作的。要取消的操作需要了解取消令牌并遵守取消请求。如果一个长时间运行的操作没有接受取消令牌的重载,仅仅在其附近有一个就不会有任何作用。那么你是说如果
WriteClientCharacteristicConfigurationDescriptorAsync
没有接受取消令牌的重载,添加
AsTask
,不会改变任何事情?那么,没有办法取消这个电话吗?看起来不像。有办法取消吗?以不合作的方式?您是否在
操作上尝试过Close方法。Close()
?您能否模拟耗时较长且可以取消的操作?当您在
等待任务
中等待时,操作似乎已经完成。取消是合作的。要取消的操作需要了解取消令牌并遵守取消请求。如果一个长时间运行的操作没有接受取消令牌的重载,仅仅在其附近有一个就不会有任何作用。那么你是说如果
WriteClientCharacteristicConfigurationDescriptorAsync
没有接受取消令牌的重载,添加
AsTask
,不会改变任何事情?那么,没有办法取消这个电话吗?看起来不像。有办法取消吗?以不合作的方式?您是否在
操作上尝试过Close方法。Close()
?您能否模拟耗时较长且可以取消的操作?在
等待任务
中等待时,操作似乎已经完成。这是一件奇怪的事情!从此行
op=characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify)到此行:
Task Task=op.AsTask(cts.Token)需要7(!!)秒…好的,可能是因为在设备回复或内部超时发生之前无法取消操作。我想7秒钟后它会被成功取消。并将与另一个答案的解决方案一起工作。如果它阻塞了UI,你可以考虑用<代码>任务运行它。运行< /COD>。是的,我想,我将再次处理另一个方法并尝试使任务正常工作。太多了!不客气。如果有任何答案帮助你解决这个问题,考虑接受那些。这是奇怪的事情!从此行
op=characteristic0.WriteClientCharacteristicConfigurationDescriptorAsync(GattClientCharacteristicConfigurationDescriptorValue.Notify)到此行:
Task Task=op.AsTask(cts.Token)需要7(!!)秒…好吧,可能是因为操作不能是c