Workflow ParallelActivity: un po' di chiarezza

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 Smile

NOTA: la discussione continua sul forum.