Home > Articles

  • Print
  • + Share This
This chapter is from the book

Control Flow Activities

Control flow activities help to define the basic structure of a workflow.

Sequence Activity

The Sequence activity (shown in Figure 3.3) is a basic building block activity that expresses the idea of doing one thing, and then another. It executes contained activities sequentially. A sequential workflow is a special kind of sequence.

Figure 3.3

Figure 3.3 A Sequence activity.

The sequence is also useful because some activity types that will contain other activities can only contain a single activity. You can only put multiple activities in them if you first add a more general container activity such as a sequence.

The Sequence activity has properties of ID, Description, and Commented. If the Commented property is set to true (see Figure 3.4) the activity will not be part of validation or exception. It also appears a shaded green color in the designer. This is very similar to commenting out code.

Figure 3.4

Figure 3.4 A commented Sequence activity.

Parallel Activity

Parallel activities (as shown in Figure 3.5) allow multiple activities to execute concurrently. It could be that there are several external requests to be made and they each take several days to respond. Or there may be a collection of short web services to call, each taking two to three seconds to respond. The Parallel activity allows requests to be initiated in parallel and may reduce the overall time it takes to complete them.

When it is initially dragged from the toolbox, the Parallel activity contains two paths of execution. You can add more by using the context menu for the Parallel activity or using the Add Branch command in the Properties pane.

Figure 3.5

Figure 3.5 A Parallel activity.

IfElse Activity

The IfElse activity executes contained activities if a condition is true.

In Figure 3.6 there are two branches. The first branch is required to have a condition and the red circle and exclamation point indicate that there is no default condition. It must be added to avoid the error.

The last branch in an IfElse is not required to have a condition though if it had one it would be like an If-EndIf structure that has no Else. The IfElse activity evaluates the leftmost branch first. If that condition returns true the activities on that branch are executed; otherwise it evaluates the next branch, and so on.

You can add branches to an IfElse in much the same way that you can add branches to a Parallel.

While Activity

The While activity executes contained activities while the condition is true. A While activity can only contain a single child activity, so this is a place where you might use a Sequence or a Parallel or another multiactivity container.

Figure 3.6

Figure 3.6 An IfElse activity.

The designer representation of the While activity in Figure 3.7 gives a good visual as to what it does. The condition is first evaluated; if it is true the contained activity is executed, and then you loop around and the loop repeats until the condition is false.

Figure 3.7

Figure 3.7 A While activity.

For-Next Loop Implemented with a While Activity

The workflow in Figure 3.8 shows how you can use a While activity as a For-Next loop. The While loops around and executes the code1 activity five times.

Figure 3.8

Figure 3.8 A workflow showing a While activity as a For-Next loop.

The While activity has a declarative condition, shown in Figure 3.9, that returns true if the LoopVariable is less than 5.

Figure 3.9

Figure 3.9 The Declarative Condition Editor showing a loop.

The class for the workflow contains the declaration for the instance variable and the code-beside method for the Code activity. In Listing 3.1, the Code activity writes a message and increments the LoopVariable.

Listing 3.1 Implementation Class of a For Loop

  <RuleConditionsAttribute(GetType(Workflow1))> _
  Partial Public Class Workflow1
    Inherits SequentialWorkflow

    Public LoopVariable As Integer

    Public Sub New()
      MyBase.New()
      InitializeComponent()

      LoopVariable = 0
    End Sub

    Private Sub code1_ExecuteCode(ByVal sender As System.Object, _
                   ByVal e As System.EventArgs)
      Console.WriteLine("Hello Again")
      LoopVariable = LoopVariable + 1
    End Sub
  End Class

ConditionedActivityGroup Activity

The ConditionedActivityGroup activity (shown in Figure 3.10) loops through a collection of activities, executing them until an Until condition is true. Each activity in the collection is executed according to a When condition and an Unless condition. These three types of conditions default so that each activity is executed once only.

Figure 3.10

Figure 3.10 A ConditionedActivityGroup activity.

For more information on the ConditionedActivityGroup activity see Chapter 8, "Advanced Activities and Activity Behaviors."

Replicator Activity

The Replicator activity, shown in Figure 3.11, contains a single activity. At runtime it executes multiple copies of that activity. It is particularly useful for a human-based workflow where a number of approvers are required, the exact number is not known until runtime.

Figure 3.11

Figure 3.11 A Replicator activity.

For more information on the Replicator activity see Chapter 8.

Delay Activity

The Delay activity causes the containing branch of the workflow to wait for a specified amount of time. The workflow may be dehydrated during the delay if it becomes completely idle and rehydrated when the time expires.

Delay has a property called TimeoutDuration that is a TimeSpan with a default value of 00:00:00. You can either specify a value for TimeoutDuration or you can implement the InitializeTimeoutDuration() handler, which is called to set the TimeoutDuration property.

You can use a Delay activity to delay until a specific time if you calculate the TimeSpan between now and then yourself. For example, if you wanted to delay until 2:30 a.m. tomorrow morning you could use the code in Listing 3.2 in your InitializeTimeoutDuration().

Listing 3.2 InitializeTimeout to Wait Until a Set Time

  Public Sub delay1_InitializeTimeoutDuration(ByVal sender As Object, _
                        ByVal e As EventArgs)
    ‘ find time today
    Dim NextStop As DateTime = DateTime.Today
    NextStop = NextStop.AddHours(2).AddMinutes(30)

    ‘ if time past today then wait until tomorrow
    If (NextStop <= DateTime.Now) Then
      NextStop = NextStop.AddDays(1)
    End If

    CType(sender,Delay).TimeoutDuration = NextStop.Subtract(DateTime.Now)
  End Sub

You might use a Delay activity to

  • Set a timeout while waiting for a response from external systems or people

  • Run a scheduled job at a specified time

  • Poll something at an interval

  • + Share This
  • 🔖 Save To Your Account