Поделиться через


Рабочие процессы блок-схемы

Данный раздел относится к версии Windows Workflow Foundation 4.

Блок-схемы лежат в основе широко известного принципа разработки программ. Действие «Блок-схема» обычно используется для реализации непоследовательных рабочих процессов, но если не требуются узлы FlowDecision, то может использоваться для реализации последовательных рабочих процессов.

Структура блок-схемы рабочих процессов

Действие «Блок-схема» представляет собой действие, которое содержит коллекцию узлов потоков, унаследованных от FlowNode. Узлы потоков могут содержать дочерние действия, подлежащие осуществлению, и направлять выполнение на другие узлы потоков.

Типы узлов потоков

Используются различные типы элементов в зависимости от типа управления потока, требуемого при выполнении элемента. К типам элементов блок-схемы относятся следующие:

  • FlowStep — моделирует один шаг выполнения в блок-схеме.

  • FlowDecision — создает ветвь выполнения на основе логического условия, такого как If.

  • FlowSwitch — обеспечивает ветвление в ходе выполнения на основе переключателя с неперекрывающимися ветвями, такого как Switch.

Каждая ссылка имеют свойство Action, определяющее действие ActivityAction, которое может быть использовано для выполнения дочерних действий, а также одно или несколько свойств Next, которые определяют элемент или элементы, выполняемые после завершения выполнения элемента.

Создание базовой последовательности действий для узла FlowStep

Для моделирования базовой последовательности, в которой поочередно выполняются два действия, используется элемент FlowStep. В следующем примере используются два элемента FlowStep для последовательного выполнения двух действий.

<Flowchart>
  <FlowStep>
    <Read Result = "[result]"/>
    <FlowStep.Next>
<FlowStep>
        <Write Text="[Hello + result]"/>
</FlowStep>
    </FlowStep.Next>
  </FlowStep>
</Flowchart>

Создание условной блок-схемы для узла FlowDecision

Чтобы смоделировать узел условного потока на блок-схеме рабочего процесса (т. е. создать ссылку, работающую аналогично символу принятия решения на стандартной блок-схеме), следует использовать узел FlowDecision. Для свойства Condition узла задан WorkflowElement, который определяет условие, а для свойств True и False заданы экземпляры FlowNode, которые будут выполняться, если выражение имеет значение true или false. В следующем примере показано определение рабочего процесса, который использует узел FlowDecision.

<Flowchart>
  <FlowStep>
    <Read Result="[s]"/>
    <FlowStep.Next>
      <FlowDecision>
        <IsEmpty Input="[s]" />
        <FlowDecision.True>
    <FlowStep>
            <Write Text="Empty"/>
    </FlowStep>
        </FlowDecision.True>
        <FlowDecision.False>
    <FlowStep>
            <Write Text="Non-Empty"/>
          </FlowStep>
        </FlowDecision.False>
      </FlowDecision>
    </FlowStep.Next>
  </FlowStep>
</Flowchart>

Создание взаимоисключающего переключателя для узла FlowSwitch

Чтобы смоделировать блок-схему, в которой на основе соответствующего значения выбирается один из взаимоисключающих вариантов пути, используется узел FlowSwitch. Для свойства Expression задан WorkflowElement’1 с параметром типа Object, который определяет значение для сопоставления с выбираемыми элементами, а свойство Cases определяет словарь ключей и объектов FlowNode для сопоставления с условным выражением и набор объектов FlowNode, которые определяют направление выполнения в случае соответствия условному выражению. FlowSwitch также определяет свойство Default, которое определяет направление выполнения при отсутствии соответствий условному выражению. В следующем примере показано, как определить рабочий процесс, который использует элемент FlowSwitch.

<Flowchart>
    <FlowSwitch>
      <FlowSwitch.Expression>
        <ReadColor/>
      </FlowSwitch.Expression>
<FlowStep x:Key="Red">
        <WriteRed/>
      </FlowStep>
      <FlowStep x:Key="Blue">
        <WriteBlue/>
      </FlowStep>
      <FlowStep x:Key="Green">
        <WriteGreen/>
      </FlowStep>
      </FlowSwitch.Cases>
    </FlowSwitch>
</Flowchart>