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 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 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 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 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 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 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 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 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 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