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

rea*_*idt 7 error-handling concurrency ccr

具有复杂的任务序列,实现错误处理可以在使用try/catch块和诸如Choice接收器之类的东西时PortSet<ActualResult, Exception>为每个小任务快速膨胀代码.

值得庆幸的是,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
Run Code Online (Sandbox Code Playgroud)

就我而言,我有一个使用CCR的计算密集型应用程序来实现分散/聚集场景,将"作业"分成一堆并行任务.(除此之外,这些作业中的多一个可以同时运行.)如果一个任务失败,我想要停止作业中的所有剩余任务,但不能停止任何其他任务.(如果我错过了一块拼图,结果对我没用,所以继续研究这个只会浪费CPU时间.)

问题是实施停止的最佳方法是什么.

一个想法是:

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

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

Cra*_*ent 1

对我来说这似乎是一个很好的方法。