首页 > 解决方案 > 如何创建通过Task.ContinueWith?

问题描述

我想在原始任务结束时附加任务,但想保留原始结果和类型。附加任务仅用于记录目的,例如写入控制台等。例如:

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>。这里我return t.Result如果任务没有遇到错误,我throw t.Exception如果任务遇到错误。看起来类型仍然存在Task<string>,但不确定异常方面。

这是正确的方法吗?或者,还有更好的方法?

标签: c#task-parallel-library

解决方案


没有理由重新抛出异常。该任务将抛出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);

仅当任务成功执行到结束时才会记录成功。如果有未处理的异常,将记录失败。

这将记录和获取结果分开。所以你可以从第一个任务中得到结果。


推荐阅读