TaskCanceledException
TaskCanceledException наследует
OperationCanceledException.
Его получают, например, из
Task.FromCanceled(token) при синхронном
ожидании через GetAwaiter().GetResult().
Исключение перехватывают отдельно от других
сбоев задачи.
Синтаксис
using System.Threading;
using System.Threading.Tasks;
Task.FromCanceled<int>(token).GetAwaiter().GetResult();
Пример
Давайте поймаем TaskCanceledException:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
using var cts = new CancellationTokenSource();
cts.Cancel();
try
{
Task.FromCanceled<int>(cts.Token)
.GetAwaiter()
.GetResult();
}
catch (TaskCanceledException)
{
Console.WriteLine("fail");
}
}
}
Результат выполнения кода:
"fail"
Пример
Давайте проверим, что это наследник
OperationCanceledException:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
using var cts = new CancellationTokenSource();
cts.Cancel();
try
{
Task.FromCanceled<int>(cts.Token)
.GetAwaiter()
.GetResult();
}
catch (TaskCanceledException ex)
{
Console.WriteLine(ex is OperationCanceledException);
}
}
}
Результат выполнения кода:
True
Пример
Давайте поймаем базовый тип через
OperationCanceledException:
using System;
using System.Threading;
using System.Threading.Tasks;
class Program
{
static void Main()
{
using var cts = new CancellationTokenSource();
cts.Cancel();
try
{
Task.FromCanceled<int>(cts.Token)
.GetAwaiter()
.GetResult();
}
catch (OperationCanceledException)
{
Console.WriteLine("fail");
}
}
}
Результат выполнения кода:
"fail"
Смотрите также
-
OperationCanceledException,
базовый класс отмены -
AggregateException,
приWait()у других сбоев задачи -
TimeoutException,
когда вышло время, а не отмена -
throw,
которым задают сбой вручную