提问者:小点点

当设备断开连接时如何取消BLE任务?


我正在用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()应该停止任务,但它没有停止执行。相反,它去执行其他异步任务。有什么方法可以轻松地停止这些异步任务吗?有什么建议吗?


共1个答案

匿名用户

您错误地使用了取消令牌,并且您的代码没有太多意义。

首先,如果要取消的TAK是,则应该在中使用而不是作为参数。您可以在调用的类中创建一个,将CancellationSource的令牌传递给它,从而可以通过调用从调用方取消任务。

我不知道您正在使用的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();
}