如何在Blazor服务器端应用程序中处理异步取消

时间:2020-06-19 01:39:44

标签: blazor blazor-server-side

我只是不确定处理异步请求取消的正确方法是什么。

我在页面上有一个方法,一个方法一个接一个地调用三个长时间运行的异步任务。如果用户从页面导航,则假定这些任务生成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方法中的任务?

在我的情况下,哪种方法是正确的?有什么建议/模式吗?

0 个答案:

没有答案