我只是不确定处理异步请求取消的正确方法是什么。
我在页面上有一个方法,一个方法一个接一个地调用三个长时间运行的异步任务。如果用户从页面导航,则假定这些任务生成TaskCanceledException类型的异常。是否可以在catch块中捕获这些特定的异常,将状态恢复为正确的状态,以便用户可以继续使用系统?这些异步任务会自动取消吗?还是我需要将取消令牌传递给异步方法,然后显式调用这些令牌的cancel方法?
尝试/捕获方法:
public void RefreshProject()
{
try
{
await LongRunningTask1();
await LongRunningTask2();
await LongRunningTask3();
}
catch (Exception ex)
{
//restore proper state
}
}
带有cancelingtokensource的方法:
public void RefreshProject()
{
CancellationTokenSource cts1 = new CancellationTokenSource();
CancellationTokenSource cts2 = new CancellationTokenSource();
CancellationTokenSource cts3 = new CancellationTokenSource();
try
{
await LongRunningTask1(cts1);
cts1.Token.ThrowIfCancellationRequested();
await LongRunningTask2(cts2);
cts2.Token.ThrowIfCancellationRequested();
await LongRunningTask3(cts3);
cts3.Token.ThrowIfCancellationRequested();
}
catch (Exception ex)
{
//restore proper state
//application specific logic
//cancel async tasks
cts1.Cancel();
cts2.Cancel();
cts3.Cancel();
}
}
还是我需要从IDisposable继承并取消Dispose方法中的任务?
在我的情况下,哪种方法是正确的?有什么建议/模式吗?