gpt4 book ai didi

c# - 如何通过 Task.ContinueWith 创建传递?

转载 作者:太空宇宙 更新时间:2023-11-03 19:42:04 26 4
gpt4 key购买 nike

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

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>但不确定异常(exception)情况。

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

最佳答案

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

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

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

关于c# - 如何通过 Task.ContinueWith 创建传递?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52138702/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com