在导航前取消可等待方法的最佳方法
本文关键字:方法 最佳 等待 导航 取消 | 更新日期: 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();
}