我正在用Xamarin表单实现BLE。我想在设备断开连接时停止BLE任务。我使用取消令牌来停止任务,还调用了一个void方法,该方法具有return,正如您在下面的代码中看到的那样
private async Task ConnectForDevice(ScanData scanData, CancellationTokenSource token)
{
try
{
await _adapter.ConnectToDeviceAsync(_device);
}
catch (DeviceConnectionException ex)
{
await UserDialogs.Instance.AlertAsync("Device got disconnected please scan again 2");
disconnected();
token.Cancel();
}
}
public async void disconnected()
{
await Application.Current.MainPage.Navigation.PopAsync();
return;
}
Token.Cancel()应该停止任务,但它没有停止执行。相反,它去执行其他异步任务。有什么方法可以轻松地停止这些异步任务吗?有什么建议吗?
您错误地使用了取消令牌,并且您的代码没有太多意义。
首先,如果要取消的TAK是
我不知道您正在使用的API/库,但我认为*
这将引发
另外,我认为
通常会有一个事件通知您这一点,但也可能没有,所以唯一的方法是轮询连接或其他什么。
因此您的代码变得更像这样:
private async Task ConnectForDevice(ScanData scanData, CancellationToken token)
{
try
{
await _adapter.ConnectToDeviceAsync(_device, token);
}
catch (DeviceConnectionException ex)
{
await UserDialogs.Instance.AlertAsync("Device got disconnected please scan again 2");
}
catch (TaskCanceledException tce)
{
Console.WriteLine("Scan was cancelled");
}
finally
{
await Disconnect();
}
}
public Task Disconnect() //NEVER USE ASYNC VOID, ONLY IN EVENT HANDLERS
{
return Application.Current.MainPage.Navigation.PopAsync();
}