具有复杂的任务序列,实现错误处理可以在使用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时间。)
问题是实施停止的最佳方法是什么。
一个想法是:
Dispatcher
个实例,并将其保留在应用程序生存期内。DispatcherQueue
。创建Causality
后立即添加DispatcherQueue
。Suspend()
。DispatcherQueue
我想知道这个建议是否可以被视为最佳实践,或者是否有更好的方法来处理这种 - 可能是相当常见的 - 情景。
答案 0 :(得分:1)
似乎是一种很好的方式来解决这个问题。