Как обрабатывать отмены asyn c в серверных приложениях Blazor - PullRequest
1 голос
/ 19 июня 2020

Я просто не уверен, как правильно обрабатывать отмену асинхронных c запросов.

У меня есть метод на странице, который вызывает одну за другой три длительные асинхронные c задачи. Если пользователь переходит со страницы, я предполагаю, что эти задачи генерируют исключения типа TaskCanceledException. Можно ли перехватить эти c исключения в блоке catch, восстановить состояние до надлежащего состояния, чтобы пользователь мог продолжать использовать систему? Будут ли эти задачи asyn c автоматически отменены, или мне нужно передать токены отмены методам asyn c, а затем явно вызвать метод отмены этих токенов?

метод с помощью try / catch:

public void RefreshProject()
{           
   try
   {
      await LongRunningTask1();
      await LongRunningTask2();
      await LongRunningTask3();
   }
   catch (Exception ex)
   {
     //restore proper state
   }
}

метод с cancellationtokensource:

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?

Какой из них является правильным в моем случае? Есть предложения / шаблоны?

...