我在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;
}
答案 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();
}