Concurrency CCR:使用因果关系处理错误的最佳实践

Concurrency CCR:使用因果关系处理错误的最佳实践,concurrency,error-handling,ccr,Concurrency,Error Handling,Ccr,由于任务序列复杂,在为每个小任务使用try/catch块和类似于PortSet上的Choice receivers之类的东西时,实现错误处理可能会快速膨胀代码 谢天谢地,CCR似乎提供了一种机制,可以用一种更通用的方式处理任务图中的异常:因果关系。一个典型的例子如下所示: Port<Exception> exceptionPort = new Port<Exception>(); Dispatcher.AddCausality(new Causality("some jo

由于任务序列复杂,在为每个小任务使用try/catch块和类似于
PortSet
上的Choice receivers之类的东西时,实现错误处理可能会快速膨胀代码

谢天谢地,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
端口例外端口=新端口();
AddCausality(新的因果关系(“某些工作”,例外端口));
仲裁人,激活(
dispatcherQueue,
Receive(false,exceptionPort,ex=>Console.WriteLine(ex));
//现在安排真正的任务
在我的例子中,我有一个计算密集型应用程序,使用CCR实现分散/聚集场景,将“作业”拆分为一组并行任务。(除此之外,这些作业中可以同时运行多个。)如果一个任务失败,我希望停止作业中所有剩余的任务,但不停止任何其他作业。(如果我错过了拼图的一部分,那么结果对我来说毫无用处,因此继续进行这项工作只会浪费CPU时间。)

问题是,实施停止措施的最佳方式是什么

一个想法是:

  • 创建一个
    Dispatcher
    实例,并在应用程序生命周期内保持它
  • 为每个“作业”(一组任务)创建一个新的
    DispatcherQueue
    。在创建
    DispatcherQueue
    后立即添加
    因果关系
  • 在异常队列的处理程序中,调用
    DispatcherQueue
    上的
    Suspend()
  • 在处理调度程序队列之前,请删除因果关系

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

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