Как создать проход через Task.ContinueWith? - PullRequest
0 голосов
/ 02 сентября 2018

Я хочу выполнить задачу в конце исходной задачи, но хотел бы сохранить исходный результат и тип. Добавленная задача предназначена только для регистрации, например, для записи в консоль и т. Д. Например:

Task.Run(() => DateTime.Now.Hour > 12 ? "Hey!" : throw new Exception())
    .ContinueWith(t =>
    {
        if (t.IsCompletedSuccessfully)
        {
            Console.WriteLine("Success");
            return t.Result;
        }
        else
        {
            Console.WriteLine("Failure");
            throw t.Exception;
        }
    });

Тип исходного задания: Task<string>. Здесь I return t.Result, если задача не обнаруживает ошибки, и I throw t.Exception, если задача сталкивается с ошибкой. Похоже, тип остается Task<string>, но не уверен насчет стороны исключения.

Это правильный способ сделать это? Или есть лучший способ?

1 Ответ

0 голосов
/ 02 сентября 2018

Нет оснований для отмены исключения. Задача выдает AggregrateException, и вы можете получить реальные исключения со свойством InnerExceptions для их обработки.

Для ведения журнала вы можете разделить успех и неудачу, используя TaskContinuationOptions:

var t = Task.Run(() => DateTime.Now.Hour > 12 ? "Hey!" : throw new Exception());

t.ContinueWith(_ => Console.WriteLine("Success"), TaskContinuationOptions.OnlyOnRanToCompletion);

t.ContinueWith(_ => Console.WriteLine("Faiure"), TaskContinuationOptions.OnlyOnFaulted);

Успех будет регистрироваться только в случае успешного выполнения задачи до конца. И сбой будет зарегистрирован, если было необработанное исключение.

Это разделяет ведение журнала и получение результата. Таким образом, вы можете просто получить результат от первого задания.

...