考虑以下示例:
正如预期的那样,我在输出窗口中看到在10秒后抛出了异常,但这并不会导致dataFlow完成(在await ab.Completion之后的断点将在1天之前被击中)。
在我的情况下,如果一个计算步骤出现异常,我希望取消整个dataFlow。
我无法看到使用tpl dataflow如何实现这一点...有什么建议吗?
谢谢...
【编辑】正如Ofir提到的,我可以这样做:
ActionBlock<TimeSpan> ab = new ActionBlock<TimeSpan>(async _ =>
{
await Task.Delay(_);
throw new Exception();
}, new ExecutionDataflowBlockOptions() { MaxDegreeOfParallelism = Int32.MaxValue });
ab.Post(TimeSpan.FromSeconds(10d));
ab.Post(TimeSpan.FromDays(1d));
await ab.Completion;
正如预期的那样,我在输出窗口中看到在10秒后抛出了异常,但这并不会导致dataFlow完成(在await ab.Completion之后的断点将在1天之前被击中)。
在我的情况下,如果一个计算步骤出现异常,我希望取消整个dataFlow。
我无法看到使用tpl dataflow如何实现这一点...有什么建议吗?
谢谢...
【编辑】正如Ofir提到的,我可以这样做:
ActionBlock<TimeSpan> ab = new ActionBlock<TimeSpan>(async _ =>
{
try
{
await Task.Delay(_);
throw new Exception();// Or any other Task thay may throw an exception.
}
catch(Exception)
{
cancelTokenSource.Cancel();
throw;
}
}, new ExecutionDataflowBlockOptions() {CancellationToken=cancelTokenSource.Token, MaxDegreeOfParallelism = Int32.MaxValue });
ab.Post(TimeSpan.FromSeconds(10d));
ab.Post(TimeSpan.FromDays(1d));
await ab.Completion;
但我希望避免的正是这个:一遍又一遍地输入try{}catch... 或者更糟糕的是:忘记它... ;)
下一步可以做的是编写ActionBlock构造函数的替代方法来处理它(它会接受一个额外的CancellationTokenSource参数)... 我惊讶于这不是直接与数据流一起提供的... 真的吗?
[最终编辑] 似乎在tpd dataFlow中没有这样的东西,而接受CancellationTokenSource作为参数的ActionBlock“扩展构造函数”(实际上是静态方法)将是可能的解决方法...