由于具有复杂的任务序列,实现错误处理会在对每个小任务使用try/catch块和类似于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在我的例子中,我有一个计算密集型的应用程序,使用CCR来实现一个分散/聚集的场景,将“作业”分割成一组并行任务。(除此之外,其中一个作业可以同时运行。)如果一个任务失败,我希望停止作业中的所有剩余任务,但不停止任何其他任务。(如果我错过了拼图的一部分,结果对我没有任何帮助,所以继续做下去只是浪费CPU的时间。)
问题是,最好的方法是执行停止。
一个想法是:
lifetime.
Dispatcher实例,并在应用程序DispatcherQueue。在创建DispatcherQueue.Causality --异常队列的处理程序,在DispatcherQueue.Suspend(),处理dispatcher队列,删除因果关系。我想知道这一建议是否可以被视为最佳做法,或者是否有更好的办法来处理这种情况-可能相当普遍-。
发布于 2010-07-27 04:28:36
对我来说这似乎是个好办法。
https://stackoverflow.com/questions/1199568
复制相似问题