CCR:使用因果关系处理错误的最佳做法

时间:2009-07-29 11:28:56

标签: concurrency error-handling ccr

具有复杂的任务序列,实现错误处理可以在使用try / catch块以及PortSet<ActualResult, Exception>上的Choice接收器等每个小任务时快速膨胀代码。

值得庆幸的是,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。创建Causality后立即添加DispatcherQueue
  3. 在异常队列的处理程序中,在Suspend()
  4. 上调用DispatcherQueue
  5. 在处理调度程序队列之前,请删除因果关系。
  6. 我想知道这个建议是否可以被视为最佳实践,或者是否有更好的方法来处理这种 - 可能是相当常见的 - 情景。

1 个答案:

答案 0 :(得分:1)

似乎是一种很好的方式来解决这个问题。