Я заметил, что задача может отменить себя, выдав OperationCanceledException
. Обычно можно указать удобную для пользователя причину в OperationCanceledException
конструктор, который позже становится сообщением об исключении. Однако в сценарии задачи это не выглядит так. Исключение отменяет задачу, но в конечном итоге преобразуется в TaskCanceledException
, а исходное сообщение заменяется общим.
Есть ли аккуратный способ указать причину отмены в этом примере? Я посмотрел на CancellationTokenSource
, но тоже не увидел варианта.
class Program
{
static async Task MyAsyncMethod()
{
await Task.Delay(TimeSpan.FromSeconds(1));
throw new OperationCanceledException("My lost cancellation reason");
}
static void Main(string[] args)
{
var task = MyAsyncMethod();
try
{
task.Wait();
}
catch (AggregateException ecxeptions)
{
var exception = ecxeptions.InnerException;
Console.WriteLine(exception.GetType()); //TaskCanceledException
Console.WriteLine(exception.Message); //A task was canceled.
Console.WriteLine(task.Status); //Canceled
Console.WriteLine(task.Exception == null); //true
}
Console.Read();
}
}