La macchina a stati disponibile nella
CTP 1 dello State Machine Activity Pack possiede uno speciale tipo di transizione, conosciuta con il nome di
self transition, o iterazione (cioè la possibilità di transitare da uno stato a se stesso); se occorre creare un loop, una iterazione, se si vuole eseguire una custom activity, quando la transizione ad altri stati non può avvenire per motivi specifici, allora è possibile creare una
self transition dal trigger associato allo stato di partenza, inserendovi le condizioni opposte a quelle inizialmente specificate per la transizione ad altro stato. In seguito occorre inserire la custom activity desiderata nella
Action della
self transition.
L'esempio riportato in questo contributo implementa una
state machine in cui sono contenuti due stati:
- il workflow giunge al primo stato e dopo una attesa di cinque secondi, se la condizione soddisfa un certo criterio, avviene la transizione allo stato finale;
- altrimenti: se la condizione soddisfa un ulteriore differente criterio, avviene la transizione al secondo stato; parte un trigger, che contiene una DelayActivity di ulteriori cinque secondi; viene verificata una condizione relativa a un contatore e, se soddisfatta, parte una sequence activity, che incrementa il contatore, verifica di nuovo la condizione precedente e, finché non viene raggiunta una determinata soglia, la transizione effettua un loop su se stessa per poi finalmente giungere alla ennesima transizione, che la porterà allo stato finale.
Si inizia creando una applicazione di tipo
WorkflowConsoleApplication e inserendo in essa una
StateMachine; si creano poi due variabili, selezionando l'apposito tab
Variables in basso a sinistra nel
designer del
workflow: la prima di tipo
string, avente come
scope la
StateMachine, che servirà per valutare la condizione di transizione; la seconda di tipo
Int32, che sarà utile per controllare il loop della
self transition.
A seguire si aggiunge un
primo State e una linea di transizione tra quest'ultimo e lo stato finale del
workflow; fate doppio clic sulla transizione e nel
trigger inserite una
activity di tipo
Delay, impostando la durata a una manciata di secondi. Inserite quindi la condizione che dovrà soddisfare la transizione: se, ad esempio, la variabile che avete creato in precedenza si chiama
target, allora scrivete
target = "final state" e nella
Action della transizione aggiungete una
WriteLine con un testo che confermerà, in fase di esecuzione, l'effettiva transizione allo stato finale.
Ora create un
secondo State e tirate una linea di transizione tra il primo stato e il secondo; nel
trigger relativo aggiungete una
DelayActivity, impostate anch'essa con un ritardo di qualche secondo e nella
Condition inserite
target = "state 2"; nella
Action invece una
WriteLine che confermerà la transizione al
secondo State. Nella seconda parte troverete i successivi step della descrizione dell'esempio, compresi i dettagli implementativi della
self transition, nonché il relativo codice sorgente.