Oggi mi è arrivata una mail di un lettore di .netSide che mi chiedeva delucidazioni circa la ParallelActivity di Windows Workflow Foundation.
Non essendo la prima richiesta in merito, ho deciso di farne un post in modo che resti visibile e possa (spero) chiarire i dubbi di altri visitatori.
Innanzitutto iniziamo col dire che questa activity rientra (come è facile aspettarsi), nel gruppo delle composite activity. Ma a cosa serve una ParallelActivity?
Il suo scopo è quello di eseguire "in parallelo" le activity contenute nei suoi n rami. Il termine "in parallelo" è stato volutamente messo tra virgolette perchè potrebbe trarre in inganno e vediamo il perchè.
Supponiamo di avere un Workflow come quello in figura (tratto dagli esempi dell'SDK e leggermente modificato).
In esso, si possono notare 3 rami all'interno della parallel che contengono una serie di activity (code activity e delay activity). Cosa accade quando entriamo nella parallel? Nella documentazione ufficiale (qui) si legge che:
The ParallelActivity activity lets you schedule two or more child SequenceActivity activity branches for processing at the same time. Although branch SequenceActivity activities are scheduled to start processing at the same time, they do not start processing at the same time. Processing begins with the execution of one activity that is contained in one of the SequenceActivity branches
La prima cosa importante è che, sebbene i rami dovessero partire "in parallelo" (come il nome suggerisce), questo non è vero. L'esecuzione inizia a tutti gli effetti quando una delle activity contenuta in uno dei rami viene eseguita (inizia la sua esecuzione).
Dopo questo primo dato di fatto, da non trascurare, viene la cosa più importante: l'esecuzione dei rami NON E' eseguita assolutamente in contemporanea! Bisogna sempre ricordare che ogni istanza di Workflow viene eseguita in un thread diverso da quello dell'applicazione host, ma che esiste UN SOLO THREAD per ogni istanzanza di Workflow!
Nella documentazione infatti si legge:
Although the SequenceActivity child branches are processed at the same time, the branch activities do not execute in a true concurrent manner. The Windows Workflow Foundation runtime uses one thread per workflow instance. All the separate branches in the ParallelActivity activity share the same single workflow instance thread. Therefore, only one activity of one branch executes at a time.
Ma allora...perchè si chiama Parallel?
La risposta è semplice: quando in uno dei rami si trova una activity "bloccante", l'esecuzione non viene interrotta ma passa alla successiva activity di un altro ramo.
Mandando in esecuzione il workflow in figura, otterremo la seguente risposta:
L'immagine non rende ma fidatevi: tra la Start 3/1 e la Start 2/1 passano 5 secondi. Eppure, se riprendiamo il Workflow, si nota che l'activity che segue la Delay è quella che scrive "Start 2/1". E' ora evidente che in prossimità della Delay 1, al posto di fermarsi, l'esecuzione si è spostata sulla prima activity disponibile di un altro ramo (Start 3/1) per poi tornare su Start 2/1 dopo la Delay.
Spero di essere riuscito a chiarire ogni dubbio sulla ParallelActivity. Se ci sono domande, potere commentare questo post o scrivere sul forum 
NOTA: la discussione continua sul forum.
Il servizio di Tracking di Windows Workflow Foundation permette di tenere traccia dell'esecuzione di ogni singola istanza di un determinato workflow. Ogni volta che ne ho parlato (durante il webcast o l'evento .netSide) ho elogiato (e continuo a farlo) la comodità di questo servizio ma non c'è stato mai il tepo di parlare dei tracking profiles.
Segnalo quindi un articolo molto itroduttivo su questo aspetto:
The concept of Tracking profiles is there to allow administrators and business users to configure the amount of data they wish to track. Users can modify tracking profiles at runtime based on business requirements without making any code changes to either the workflow or runtime service components.
Source: Moustafa Khalil Ahmed's Space : About WF Tracking Profiles...
Vi interessa approfondire il discorso? Se si, fatemelo sapere. Magari si organizza qualcosa 