gpt4 book ai didi

c# - 在导航之前取消等待方法的最佳方法?

转载 作者:行者123 更新时间:2023-11-30 16:06:52 25 4
gpt4 key购买 nike

我在 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;
}

最佳答案

My goal is to stop this asynchronous operation before doing the navigation to another page. What is your recommendation?

传递一个CancellationToken到您的异步方法,并监视该 token 。如果用户想要导航到第二页,请使用 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();
}

关于c# - 在导航之前取消等待方法的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31671674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com