CCR: Лучшая практика для ошибок из-за неправильного обращения с помощью причинных связей

Наличие сложной последовательности задач, реализация обработки ошибок могут быстро чрезмерно увеличить размер кода при использовании блоков попытки/выгоды и наполнить как получатели Выбора на 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 для реализации рассеиваться/собирать сценария, разделяя "задания" на набор параллелизированных задач. (Помимо этого, больше затем одно из этих заданий может работать одновременно.) В случае, если та одна задача перестала работать, я хочу для остановки всех остающихся задач в задании, но не любом другом задании. (Результаты бесполезны мне, если бы я пропускаю часть загадки, таким образом продолжение работать над этим было бы просто пустой тратой процессорного времени.)

Вопрос - то, что лучший способ состоял бы в том, чтобы реализовать остановку.

Одна идея была бы:

  1. Создайте один сингл Dispatcher экземпляр и сохраняет его за время жизни приложения.
  2. Создайте новое DispatcherQueue для каждого "задания" (группа задач). Добавьте Causality сразу после создания DispatcherQueue.
  3. В обработчике для очереди исключения звонить Suspend() на DispatcherQueue.
  4. Прежде, чем расположить очередь диспетчера, удалите причинную связь.

Интересно, может ли это предложение быть расцененной лучшей практикой, или если существует лучший подход для контакта с таким - вероятно, довольно распространенный - сценарий.

7
задан realMarkusSchmidt 29 July 2009 в 11:28
поделиться