c# - 如何创建通过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>
,但不确定异常方面。
这是正确的方法吗?或者,还有更好的方法?
解决方案
没有理由重新抛出异常。该任务将抛出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);
仅当任务成功执行到结束时才会记录成功。如果有未处理的异常,将记录失败。
这将记录和获取结果分开。所以你可以从第一个任务中得到结果。
推荐阅读
- python - Pandas - 为什么会抛出 ValueError?
- swift - Swift 数组分块问题中的组合数组和索引范围问题
- php - 如何将数字与php字符串的末尾分开并将它们保存到不同的变量中
- javascript - LocalStorage 不保存 onclick 属性
- r - 更改标记的大小、颜色和 dragulaInput 的文本
- typescript - 如何使用基于接口的值填充 mongoose 实体?
- python - 使用 tkinter 输入框中的变量来选择字典值
- java - 重构包含多个 if 条件的代码
- gcloud - Google Cloud Build 未使用我的超时设置
- python - 如何使用 Python 对交替行进行颜色编码,但如果某些列值相同,则行的颜色与前一行相同