在导航前取消可等待方法的最佳方法

本文关键字:方法 最佳 等待 导航 取消 | 更新日期: 2023-09-27 18:05:17

我在Xamarin应用程序工作,但我认为我的问题更集中在。. NET框架和c# 。

例如,我导航到PageOne,在构造函数中被称为异步方法InitializePageOneData()

public PageOne()
{
    await InitializePageOneData()
}

但是就在这一刻,当它正在等待方法执行时,我导航到第二个页面(PageTwo),它有另一个异步操作,但是我看到InitializePageOneData()方法没有停止它的执行。

我的目标是在导航到另一个页面之前停止这个异步操作。你的建议是什么?

注意:在异步操作中,我使用TaskCompletionSource:

    private Task<Response> ProcessRequest(Request request)
    {
        tsc = new TaskCompletionSource<Response>();
        eventHandler = (s, e) =>
        {
            try
            {
                _client.ProcessRequestsCompleted -= eventHandler;
                tsc.TrySetResult(e.Result);
            }
            catch (Exception ex)
            {
                _client.ProcessRequestsCompleted -= eventHandler;
                tsc.TrySetException(ex);
            }
        };
        _client.ProcessRequestsCompleted += eventHandler;
        _client.ProcessRequestsAsync(request);
        return tsc.Task;
    }

在导航前取消可等待方法的最佳方法

我的目标是在执行导航到另一个页面。你的建议是什么?

CancellationToken传递给异步方法,并监视该令牌。如果用户想要导航到第二页,使用CancellationTokenSource来取消该操作。

一个例子是:

private CancellationTokenSource cts = new CancellationTokenSource();
public async Task LoadPageOneAsync()
{
    try
    {
        await InitializePageOneDataAsync(cts.Token)
    }
    catch (OperationCanceledException e)
    {
        // Handle if needed.
    }
}
public async Task InitializePageOneDataAsync(CancellationToken cancellationToken)
{
    cancellationToken.ThrowIfCancellationRequested();
    foreach (var something in collection)
    {
        cancellationToken.ThrowIfCancellationRequested();
        // Do other stuff
    }   
}

当您想取消时,从PageTwo调用cts.Cancel():

public async Task LoadPageTwoAsync()
{
    cts.Cancel();
    cts = new CancellationTokenSource();
    await LoadSecondPageAsync();
}