Я просто не уверен, как правильно обрабатывать отмену асинхронных 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?
Какой из них является правильным в моем случае? Есть предложения / шаблоны?