Su di un punto le versioni della macchina a stati convergono: entrambe hanno il loro inizio con un
initial state, che differisce nella
CTP 1 dello State Machine Activity Pack dalla classe
StateMachine contenente la proprietà
InitialState rispetto a WF3, in cui la classe
StateMachineWorkflowActivity contiene la proprietà
InitialStateName; inoltre entrambe hanno azioni
entry,
exit e transizioni.
Anche nel
final state le cose sostanzialmente non cambiano: non esistono ovviamente azioni
entry ed
exit e nell'ambito di un
composite state il
final indica il termine dei
child state; in WF3 si utilizza la proprietà
CompletedStateName della classe
StateMachineWorkflowActivity, nella
CTP 1 dello State Machine Activity Pack si utilizza
State.IsFinal.
Con
Microsoft.Activities.Statements.Transition si definisce una transizione: le transizioni di stato corrispondono a una collection di oggetti
Transition sulla classe
State e ciascuna transizione deve avere il suo
trigger; la transizione possiede quattro proprietà:
To specifica la tipologia di stato della transizione come destinazione;
Trigger specifica quale
trigger della transizione deve essere attivato;
Condition è la condizione da verificare per eseguire la transizione;
Action specifica quale
activity eseguire all'avvio della transizione.
Altro discorso è la
transizione in WF3,
System.Workflow.Activities.SetStateActivity.SetStateActivity.TargetStateName è la proprietà con la quale si specifica lo stato della transizione; il suo utilizzo può avvenire sia nell'activity
StateInitializationActivity che in
EventDrivenActivity, mentre le condizioni possono essere verificate mediante
System.Workflow.Activities.IfElseActivity.
Il codice XAML seguente è un esempio di workflow di una semplice macchina a stati contenente una transizione di stato e una activity di tipo
DelayActivity; quest'ultima effettua un ritardo di 5 secondi prima di passare allo stato finale del workflow:
<Activity mc:Ignorable="sap" x:Class="WorkflowConsoleApplication1.Workflow1" sap:VirtualizedContainerService.HintSize="654,676" mva:VisualBasic.Settings="Assembly references and imported namespaces for internal implementation" xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:av="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:mas="clr-namespace:Microsoft.Activities.Statements;assembly=Microsoft.Activities.StateMachine" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:mv="clr-namespace:Microsoft.VisualBasic;assembly=System" xmlns:mva="clr-namespace:Microsoft.VisualBasic.Activities;assembly=System.Activities" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:s1="clr-namespace:System;assembly=System" xmlns:s2="clr-namespace:System;assembly=System.Xml" xmlns:s3="clr-namespace:System;assembly=System.Core" xmlns:sad="clr-namespace:System.Activities.Debugger;assembly=System.Activities" xmlns:sap="http://schemas.microsoft.com/netfx/2009/xaml/activities/presentation" xmlns:scg="clr-namespace:System.Collections.Generic;assembly=System" xmlns:scg1="clr-namespace:System.Collections.Generic;assembly=System.ServiceModel" xmlns:scg2="clr-namespace:System.Collections.Generic;assembly=System.Core" xmlns:scg3="clr-namespace:System.Collections.Generic;assembly=mscorlib" xmlns:sd="clr-namespace:System.Data;assembly=System.Data" xmlns:sl="clr-namespace:System.Linq;assembly=System.Core" xmlns:st="clr-namespace:System.Text;assembly=mscorlib" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<mas:StateMachine InitialState="{x:Reference __ReferenceID1}" sad:XamlDebuggerXmlReader.FileName="c:documents and settingsfcaruccidocumentivisual studio 2010ProjectsWorkflowConsoleApplication1WorkflowConsoleApplication1Workflow1.xaml" sap:VirtualizedContainerService.HintSize="614,636"> <sap:WorkflowViewStateService.ViewState>
<scg3:Dictionary x:TypeArguments="x:String, x:Object">
<x:Boolean x:Key="IsExpanded">False</x:Boolean>
<x:Double x:Key="StateContainerWidth">600</x:Double>
<x:Double x:Key="StateContainerHeight">600</x:Double>
<av:PointCollection x:Key="ConnectorLocation">300,77.5 300,107.5 300.131,107.5 300.131,167</av:PointCollection>
</scg3:Dictionary>
</sap:WorkflowViewStateService.ViewState>
<mas:State x:Name="__ReferenceID1" DisplayName="State" sap:VirtualizedContainerService.HintSize="326,410">
<mas:State.Entry>
<WriteLine sap:VirtualizedContainerService.HintSize="300,150" Text="Entro nello stato iniziale" />
</mas:State.Entry>
<mas:State.Transitions>
<mas:Transition DisplayName="" sap:VirtualizedContainerService.HintSize="326,452">
<mas:Transition.Trigger>
<Delay Duration="00:00:05" sap:VirtualizedContainerService.HintSize="300,150" />
</mas:Transition.Trigger>
<sap:WorkflowViewStateService.ViewState>
<scg3:Dictionary x:TypeArguments="x:String, x:Object">
<av:PointCollection x:Key="ConnectorLocation">300.131,253 300.131,390.5 260,390.5 260,402.5</av:PointCollection>
</scg3:Dictionary>
</sap:WorkflowViewStateService.ViewState>
<mas:Transition.To>
<mas:State x:Name="__ReferenceID0" DisplayName="Final" IsFinal="True">
<sap:WorkflowViewStateService.ViewState>
<scg3:Dictionary x:TypeArguments="x:String, x:Object">
<av:Point x:Key="ShapeLocation">230,402.5</av:Point>
<av:Size x:Key="ShapeSize">60,75</av:Size>
</scg3:Dictionary>
</sap:WorkflowViewStateService.ViewState>
</mas:State>
</mas:Transition.To>
<mas:Transition.Action>
<WriteLine sap:VirtualizedContainerService.HintSize="300,150" Text="Transizione allo stato finale" />
</mas:Transition.Action>
</mas:Transition>
</mas:State.Transitions>
<sap:WorkflowViewStateService.ViewState>
<scg3:Dictionary x:TypeArguments="x:String, x:Object">
<av:Point x:Key="ShapeLocation">234.5,167</av:Point>
<av:Size x:Key="ShapeSize">131,86</av:Size>
<x:Double x:Key="StateContainerWidth">117</x:Double>
<x:Double x:Key="StateContainerHeight">50.446666666666658</x:Double>
</scg3:Dictionary>
</sap:WorkflowViewStateService.ViewState>
<mas:State.Exit>
<WriteLine sap:VirtualizedContainerService.HintSize="300,150" Text="Lascio lo stato iniziale" />
</mas:State.Exit>
</mas:State>
<x:Reference>__ReferenceID0</x:Reference>
</mas:StateMachine>
</Activity>