[.Net3] WF et les activités parallèles

Activité Parallel

Introduction

Ce tutoriel a pour objectif de vous fournir un aperçu des activités parallèles proposé dans WF. Dans un premier temps nous verrons par l''exemple comment fonctionne l''activité Parallel et puis comment synchroniser l''accès aux données de plusieurs séquences d''exécutions parallèles. Une troisième activité existe ConditionedActivityGroup mais elle ne sera pas mise en application ici.

Source du projet disponible ici:
http://codes-sources.commentcamarche.net/source/45645-net3-wf-exemple-d-activites-paralleles

Activité Parallel

Présentation

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 les activités de séquences enfants d'une activité Parallel ? Simple, une 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 voici à 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ée 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, ouvrez Visual Studio (2005 avec support de WF ou la version 2008) et créez 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 . ...

Nous 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 les séquences d'activités entre autre présentes dans une activité Parallel , WF met à disposition une activité particulière chargée de faire le travail à notre place. Je vous présente donc l'activité SynchronizationScope .

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 ne bascule vers un autre chemin parallèle (une autre séquence d'activités parallèle). Tiens ! Ce mécanisme me fait penser au mutex, qu'en pensez-vous ?

Démo

Cette démo sera la même abordée précédemment, ici va être ajouté uniquement les activités SynchronizationScope afin de synchroniser les 2 séquences d'exécutions parallèles de notre 1è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 contenues dans les séquences d'activités dans les activités de synchronisation. ( Voir capture ci-dessous).

Simple à 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

Une capture vaut mieux qu'un long discourt.. La synchronisation des données est bien là. :)

Ce document intitulé « [.Net3] WF et les activités parallèles » issu de CodeS SourceS (codes-sources.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.