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=等待任务代码>
现在,即使CancellationToken的IsCancellationRequested-属性设置为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