Concurrency CCR:使用因果关系处理错误的最佳实践
由于任务序列复杂,在为每个小任务使用try/catch块和类似于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
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()
我想知道这个建议是否可以被视为最佳实践,或者是否有更好的方法来处理这种可能相当普遍的情况。对我来说似乎是一个很好的方法