7

拥有复杂的任务序列,在PortSet<ActualResult, Exception>为每个小任务使用 try/catch 块和诸如选择接收器之类的东西时,实现错误处理会很快使代码膨胀。

值得庆幸的是,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().DispatcherQueue
  4. 在处理调度程序队列之前,删除因果关系。

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

4

1 回答 1

1

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

于 2010-07-27T04:28:36.273 回答