7
执行错误处理过程可能会使每个小任务在使用try/catch块和诸如PortSet<ActualResult, Exception>
之类的选择接收器之类的东西时快速膨胀代码。CCR:使用因果性处理错误的最佳实践
谢天谢地,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
。在创建DispatcherQueue
后立即添加Causality
。 - 在异常队列的处理程序中,请致电
DispatcherQueue
上的Suspend()
。 - 在处理调度程序队列之前,请删除因果关系。
我想知道这个建议是否可以被认为是最佳实践,或者是否有更好的方法来处理这种可能相当常见的情况。