如何创建直通Task.ContinueWith?
How to create pass through 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);
只有任务执行成功才会记录成功,直到结束。如果有未处理的异常,将记录失败。
这将记录和获取结果分开。所以你可以从第一个任务中得到结果。
我想在原始任务结束时添加一个任务,但想保留原始结果和类型。附加任务仅用于记录目的,例如写入控制台等。例如:
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);
只有任务执行成功才会记录成功,直到结束。如果有未处理的异常,将记录失败。
这将记录和获取结果分开。所以你可以从第一个任务中得到结果。