Una ParallelActivity è un'actività che contiene due o più SequenceActivity figlie. La SequenceActivity è l'unica activity che può essere figlia di una ParallelActivity. (Fonte MSDN)
La ParallelActivity prevede che diverse attività tra loro NON correlate, vengano eseguite "contemporaneamente". Come il grande Michele insegna, questo non è del tutto vero, vediamo perchè...
L'architettura del Windows Workflow Foundation prevede che un workflow sia ospitato all'interno di un'applicazione, la quale istanzierà opportunamente questo oggetto ne invocherà il metodo Start() ma sarà il WF Runtime Engine che provvederà alla sua esecuzione in un thread distinto.
Ed ecco il punto...Come può un singolo thread portare avanti ben 3 attività contemporaneamente? La risposta è semplice: NON può.
Lo si può facilmente dimostrare creando un workflow semplice come quello illustrato le cui CodeActivity eseguiranno tutte lo stesso codice: se le attività verranno eseguite contemporaneamente avranno tutte ora inizio e ora fine attività pressochè idetentici. Proviamo:
Il codice eseguito da ogni CodeActivity è banalmente una conta da 0 a un numero grande a piacere. Di seguito la routine che ha come unico parametro il nome del chiamante ad esempio:
private void ExecuteActivity(string ca)
{
int x = 0;
Console.WriteLine("START (" + ca + "): " + DateTime.Now.ToString("H:mm:ss:fff"));
for (int i = 0; i < maxValue; i++)
{
x = i;
}
Console.WriteLine("END (" + ca + ") : " + DateTime.Now.ToString("H:mm:ss:fff"));
Console.WriteLine("-----------------------------");
}
Ogni CodeActivity stamperà a video l'ora, con precisione fino ai millisecondi, di inizio e fine attività. Ecco il risultato:
START WF e END WF sono data e inizio della ParallelActivity, tra questi due valori troviamo gli orari di esecuzioe delle singole SequenceActivity: come possiamo notare non engono eseguite in parallelo, bensì in modo sequenziale e rispettando un certo ordine di esecuzione delle singole CodeActivity che risulterà molto chiaro aggiungendo altre 3 CodeActivity e analizzando gli orari.
L'ordine di esecuzione va da sinistra verso destra e (ovviamente) dall'alto verso il basso: 1, 2, 3, 4, 5, 6. E' evidente che il termine "esecuzione parallela" in questo caso è da intendersi che l'attività è totalmente eseguita se e soltanto se TUTTE le SequenceActivity sono giunte al termine della loro esecuzione.
Ma quindi, quando è più opportuno usare questa "parallel che non è una parallel"? A voi i suggerimenti...