我正在尝试将Task.ContinueWith
与TaskContinuationOptions.AttachedToParent
一起使用来执行延续任务,例如
Task outerTask = new Task(() => Console.WriteLine("Outer"));
Task innerTask = outerTask.ContinueWith(t =>
{
Thread.Sleep(500);
Console.WriteLine("Inner");
},
TaskContinuationOptions.AttachedToParent | TaskContinuationOptions.OnlyOnRanToCompletion);
outerTask.Start();
outerTask.Wait();
Console.WriteLine("Outer done");
此代码的输出是
Outer
Outer done
Inner
但是我期望/尝试实现的是
Outer
Inner
Outer done
是否可以使用
AttachedToParent
阻止外部任务完成,或者AttachedToParent
仅对嵌套任务有效?编辑:
我想要实现的是,我想在
outerTask
成功完成后运行一个继续任务。我希望outerTask
将异常从innerTask
传播到调用者,而不必处理innerTask
。如果outerTask
失败,它应该立即抛出异常(在outerTask.Wait()
上而不调用innerTask
)。 最佳答案
您的代码中没有父子任务。
您可能要检查什么是内部任务或子任务,它可以有两种类型:
更新
最后引用:
对于您的情况(其中没有父子任务),请阅读Handling Exceptions with Continuations:
链接文章提供的捕获传播异常的代码示例
更新:
可能您已经从MSDN文章Task.ContinueWith Method (Func, CancellationToken, TaskContinuationOptions, TaskScheduler)中看到了代码示例,该代码示例说明了如果先行失败/成功(反之亦然,有4种组合),则如何防止/遵循继续任务。但是,这不是父子任务,而是先行继续任务,因此,没有任何遏制或链接可以在任一方向上传播异常。
对于子代任务,不可能在启动子任务之后且仅在父任务失败(或显然从子任务中取消父任务)之后阻止子任务。