拥有复杂的任务序列,在PortSet<ActualResult, Exception>
为每个小任务使用 try/catch 块和诸如选择接收器之类的东西时,实现错误处理会很快使代码膨胀。
值得庆幸的是,CCR 似乎提供了一种机制来以更通用的方式处理任务图的异常:因果关系。一个典型的例子如下所示:
Port<Exception> exceptionPort = new Port<Exception>();
Dispatcher.AddCausality(new Causality("some job", exceptionPort));
Arbiter.Activate(
dispatcherQueue,
Arbiter.Receive(false, exceptionPort, ex => Console.WriteLine(ex)));
// now schedule the real tasks
在我的例子中,我有一个计算密集型应用程序,它使用 CCR 来实现分散/聚集场景,将“作业”拆分成一堆并行化的任务。(除此之外,这些作业中的一个以上可以同时运行。)如果一个任务失败,我想停止该作业中的所有剩余任务,而不是任何其他作业。(如果我遗漏了一块拼图,结果对我毫无用处,所以继续努力只会浪费 CPU 时间。)
问题是实施停止的最佳方法是什么。
一个想法是:
- 创建一个
Dispatcher
实例并在应用程序生命周期内保留它。 DispatcherQueue
为每个“工作”(一组任务)创建一个新的。Causality
创建后立即添加DispatcherQueue
.- 在异常队列的处理程序中,调用
Suspend()
.DispatcherQueue
- 在处理调度程序队列之前,删除因果关系。
我想知道这个建议是否可以被视为最佳实践,或者是否有更好的方法来处理这种 - 可能相当普遍 - 场景。