Рабочий процесс Windows - ветвь IfElse - PullRequest
2 голосов
/ 08 января 2009

Я пытаюсь использовать Windows Workflow и у меня есть модель, похожая на изображение в ссылке ниже:
Workflow screen shot

После каждой из операций отправки (GetSomthing, GetSomthingElse, GetSomeMoreStuff) вызывается одно и то же настраиваемое действие (LogSomthingBadHappened).

Хотя на моей картинке в моей реальной модели это может показаться не так уж и плохо, пользовательская операция представляет собой SequenceActivty, имеет довольно много узлов, и при повторении 3 раза рабочий процесс выглядит очень некрасиво.

Я хотел бы сделать что-то вроде этого:
Edited Workflow screen shot

Можно ли объединить ветви IfElse следующим образом?
Должен ли я вместо этого использовать рабочий процесс конечного автомата (пока не понял)?

Ответы [ 4 ]

1 голос
/ 09 января 2009

В последовательных рабочих процессах все шаги должны отображаться в определенном порядке, а путь выполнения регулируется исключительно структурами управления (IF, WHILE).
Изменение пути выполнения способом, который вы описываете, будет похоже на использование GOTO оператор в императивном коде, который, как мы знаем, приводит к ненужной сложности.

Если действия, содержащиеся в SequenceActivity , которые необходимо выполнить на разных этапах рабочего процесса, в точности совпадают, вы можете встроить их в настраиваемое действие . Таким образом, ими легче управлять, поскольку они содержатся в одной логической единице.
В императивном коде это будет похоже на рефакторинг части дублированного кода в метод, который затем вызывается в нескольких местах.

1 голос
/ 09 января 2009

Другая альтернатива, которая может сработать, - это поместить ваше действие LogSomthingBadHappened в пользовательский рабочий процесс и включать его несколько раз. Несколько вещей, на которые следует обратить внимание: подпроцесс выполняется асинхронно , если для действия LogSomthingBadHappened требуется информация о состоянии из основного рабочего процесса, его копирование в подпроцесс может быть трудным.

Я не пробовал это, так что это может даже не сработать.

1 голос
/ 09 января 2009

Используйте FaultHandler в рабочем процессе и сгенерируйте определенный тип исключения, который обработчик обработает. Не самая изящная, но я думаю, что это должно сработать.

0 голосов
/ 28 февраля 2009

Я думаю, что ответ gbanfill указывает в правильном направлении.

Обобщая, я определяю проблему как:

Есть ли способ определить группу действий, которые будут выполняться в нескольких местах рабочего процесса?
Дальнейшие требования:

  1. Группа действий должна быть определена только в XAML, т.е. без кода.
  2. Тип ввода в эту группу, конечно, будет фиксированным, но фактические значения должны зависеть от вызова (например, вызова функции).

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

У этого пользовательского действия должно быть как минимум два параметра: идентификатор рабочего потока и входные параметры.

...