2009-07-29 91 views
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时间。)

问题是最好的办法是执行停止。

一个想法是:

  1. 创建一个单一Dispatcher实例,并保持对应用程序生命周期。
  2. 为每个“工作”(一组任务)创建一个新的DispatcherQueue。在创建DispatcherQueue后立即添加Causality
  3. 在异常队列的处理程序中,请致电DispatcherQueue上的Suspend()
  4. 在处理调度程序队列之前,请删除因果关系。

我想知道这个建议是否可以被认为是最佳实践,或者是否有更好的方法来处理这种可能相当常见的情况。

回答

1

似乎是一种很好的方式去向我走。