Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 导航前取消等待方法的最佳方法?_C#_Asynchronous_Async Await_Task_Cancellation - Fatal编程技术网

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

C# 导航前取消等待方法的最佳方法?,c#,asynchronous,async-await,task,cancellation,C#,Asynchronous,Async Await,Task,Cancellation,我在Xamarin应用程序中工作,但我认为我的问题更集中在.NET framework和C#中 例如,我导航到PageOne,在构造函数中称为异步方法InitializePageOneData() public PageOne() { await InitializePageOneData() } 但就在这一刻,当它等待方法执行时,我导航到第二个页面(PageTwo),其中有另一个异步操作,但我看到InitializePageOneData()方法没有停止他的执行 我的目标是在导航到另

我在Xamarin应用程序中工作,但我认为我的问题更集中在.NET frameworkC#

例如,我导航到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;
    }
专用任务处理请求(请求)
{
tsc=新任务完成源();
eventHandler=(s,e)=>
{
尝试
{
_client.ProcessRequestsCompleted-=eventHandler;
tsc.TrySetResult(e.Result);
}
捕获(例外情况除外)
{
_client.ProcessRequestsCompleted-=eventHandler;
tsc.Trystexception(ex);
}
};
_client.ProcessRequestsCompleted+=eventHandler;
_client.ProcessRequestsAsync(请求);
返回tsc任务;
}
我的目标是在执行 导航到另一个页面。你的建议是什么

将a传递给异步方法,并监视该令牌。如果用户希望导航到第二页,请使用取消该操作

例如:

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();
}

谢谢你的帮助,但是我该如何取消任务呢?在这种情况下,请致电cts.Cancel()@Fran_gg7你说得对,我忘了提到这一点。编辑了我的答案。@YuvalItzchakov,这对我不起作用……可能是因为我在使用TaskCompletionSource?我用TaskCompletionSource实现更新了我的问题。@Frann在哪里?我不明白