C# 导航前取消等待方法的最佳方法?
我在Xamarin应用程序中工作,但我认为我的问题更集中在.NET framework和C#中 例如,我导航到PageOne,在构造函数中称为异步方法InitializePageOneData()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()方法没有停止他的执行 我的目标是在导航到另
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在哪里?我不明白