Activité Parallel
Cette activité vous permet d'exécuter des activités de s équences ( minimum de 2 ) de façon parallèle dans un même thread. Et oui l'activité Parallel n'est pas une activité dîtes multithreads comme son nom laisse penser.
Mais alors comment WF traite-il l es activités de séquences enfants d'une activité Parallel ? Simple, u ne activité de séquence est traitée individuellement jusqu'à ce qu'elle se termine puis transfère l'exécution à l'activité de séquence suivante. Ils ne sont donc pas vraiment exécutés de manière parallèle mais considérons la comme une vraie activité exécutant des activités de séquences en parallèle.
Ci-dessus voic i à quoi ressemble une activité Parallel avec ses séquences d'activités enfants. Bien évidement le nombre de séquences d'activités enfants peut aller bien au-delà de deux (clic droit sur l'activité puis ajouter une branche) .
Démo
Cette démo est en charge d'afficher une série de nombre (dur dur :) ) , et est composé d'une activité Parallel et de 2 séquences d'activités enfants. Chacune des séquences va contenir 2 activités Code , lesquels vont afficher dans la console leur série de nombre.
Commençons, o uvrez Visual Studio ( 2005 avec support de WF ou la version 2008 ) et crée z une application console de workflow séquentiel .
Sélectionnez dans la boite à outils l'activité Parallel
et glissez-la sur votre workflow . Nous appellerons cette activité « ParallelAct » . Ensuite ajoutez dans chacune des 2 séquences d'activités enfants 2 activités Code nommés comme ci-dessous . Dans la propriété ExecuteCode de ses activités Code spécifiez le nom de la méthode qui sera appelé en respectant le nommage suivant « codeDisplay1 » pour l'activité Code « codeActNum1 » , etc . ...
N ous allons demander l'affichage par chacun des activités Code d'une série de nombre. Copiez le code suivant dans la page de code ( par défaut Workflow1 . cs ) associé à notre workflow .
private void codeDisplay1( object sender, EventArgs e)
{
Console .WriteLine();
for ( int i = 0; i < 10; i++)
Console .Write( "{0} " , i);
}
private void codeDisplay2( object sender, EventArgs e)
{
Console .WriteLine();
for ( int i = 10; i < 20; i++)
Console .Write( "{0} " , i);
}
private void codeDisplay3( object sender, EventArgs e)
{
Console .WriteLine();
for ( int i = 20; i < 30; i++)
Console .Write( "{0} " , i);
}
private void codeDisplay4( object sender, EventArgs e)
{
Console .WriteLine();
for ( int i = 30; i < 40; i++)
Console .Write( "{0} " , i);
}
Maintenant cliquez sur le workflow séquentiel afin d'afficher ses propriétés. Mettez la valeur « code Wait » sur la propriété Completed et copiez le code suivant pour nous permettre d'observer le résultat de l'exécution du workflow une fois terminée.
private void codeWait( object sender, EventArgs e)
{
Console .Read();
}
Analyse du résultat
Une fois le workflow séquentiel exécuté , voici le résultat obtenu ci-dessous.
La preuve est là :), les 2 séquences d'activités enfants sont bien exécutées de manière parallèle puisqu'une fois la séquence d'activité de gauche exécutée (activité Code « codeActNum1 ») , c'est au tour de la séquence d'activité de droite (activité Code « codeActNum3 ») de s' exécuter et ainsi de suite suivant le nombre de séquence d'activités enfants .
Activité SynchronizationScope
Pour synchroniser l es séquences d'activités entre autre présente dans une activité Parallel , WF met à disposition u ne activité particulière chargé de faire le travail à notre place . Je vous présente donc l'activité Synch r onizationScope .
Elle garantit que toutes les activités se trouvant à l'intérieur de celle-ci vont s'exécuter jusqu' au bout avant que l'exécution bascule vers un autre chemin parallèle (une autre séquence d'activités parallèle ) . Tien t ! Ce mécanisme me fait penser au mutex , qu'en pensez-vous ?
Démo
Cette démo se ra la même abordée précédemment, ici va être ajouté uniquement les activités SynchronizationScope afin de synchroniser l es 2 séquences d'exécutions parallèles de notre 1 ière démo.
Ouvrez la solution précédemment créée avec Visual Studio et ajoutez dans chacune des activités de séquences l'activité SynchronizationScope
que vous nommerez « syncScopeAct1 » et « syncScopeAct2 ». A présent déplacez les activités Code contenu dans les séquences d'activités dans les activités de synchronisation. ( Voir capture ci-dessous).
S imple à mettre en place vous ne trouvez pas ? Cependant il reste une chose importante à définir à savoir la propriété SynchronizationHandles , mettez -y la valeur « SyncParallelAct » . Elle va fournir à nos activités de séquence une exécution en série (à condition justement que nos activités de synchronisation partage la même valeur SynchronizationHandles ) . Ceci ressemble encore une fois étrangement au mutex ! :)
R ésultat
Exécutez le workflow et regardons le résultat ensemble
Une capture vaut mieux qu'un long discourt.. La synchronisation des données est bien la. :)