如何进行透明的 ContinueWith 回调,转发任务完成信息
本文关键字:任务 转发 信息 回调 何进行 透明 ContinueWith | 更新日期: 2023-09-27 18:34:19
我有一个带有ContinueWith
回调的Task
。然而,这是在一个返回Task
的单独函数中,所以调用者可以选择添加更多ContinueWith
回调或做任何他想做的事情。我需要一种方法来使第一个ContinueWith
回调透明,以便它传递结果(不难)和Exception
属性(这似乎更难)。
如果我重新抛出异常,如果调用方不添加另一个可以处理它的ContinueWith
回调,我会遇到问题,并且它会在未经处理的情况下掉到我想避免的外部空间。
另一方面,我不知道如何在不抛出现有任务的情况下将现有Exception
添加到当前任务中。
下面是一些示例代码。
Task.Factory.StartNew(() => {
throw new Exception("test");
}).ContinueWith(t => {
// this is my general handler
MyExceptionHandler.Handle(t.Exception);
// etc...
// HERE set the Exception for the current task to forward it
return t.Result; // result forwarded
}).ContinueWith(t => {
// this MIGHT be appended by consumer code
if (t.Exception) // HERE I would like to see the exception which might have been thrown be the original task.
// do whatever ...
});
更新
我实际上已经注意到Exception
确实被传播了,但它被重新包装成一个新的AggregateException
。
你描述的不能做。要让异常流经您的延续,您需要抛出它。
但是,您可以做的是在同一任务上添加多个延续,而不是链接它们。第一个确保异常得到处理,其他人可以使用结果(或异常):
Task task = ...
task.ContinueWith(
_ => MyExceptionHandler.Handle(_.Exception),
TaskContinuationOptions.OnlyOnFaulted);
task.ContinueWith(_ =>
{
if (_.Exception)
{
// ...
}
});