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

时间:2015-07-28 08:57:04

标签: c# asynchronous async-await task cancellation

我在Xamarin应用程序中工作,但我认为我的问题更集中在 .NET framework 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;
    }

1 个答案:

答案 0 :(得分:3)

  

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

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
    }   
}

如果要取消,请从cts.Cancel()调用PageTwo

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

    await LoadSecondPageAsync();
}