Partager via


ParallelForEach non générique

Cette rubrique s'applique à Windows Workflow Foundation 4.

.NET Framework version 4 fournit, dans sa boîte à outils, un ensemble d'activités de flux de contrôle, notamment ParallelForEach, qui permet l'itération au sein des collections IEnumerable.

ParallelForEach requiert que sa propriété Values soit de type IEnumerable. Cela empêche les utilisateurs d'itérer au sein des structures de données qui implémentent l'interface IEnumerable (par exemple, ArrayList). La version non générique de ParallelForEach passe outre cette spécification, aux dépens d'un runtime plus complexe afin de garantir la compatibilité des types des valeurs dans la collection.

Cet exemple montre comment implémenter une activité ParallelForEach non générique et son concepteur. Cette activité peut être utilisée pour itérer au sein de ArrayList.

Activité ParallelForEach

L'instruction C#/VB foreach énumère les éléments d'une collection, exécutant une instruction incorporée pour chaque élément de la collection. Les activités WF équivalentes sont ForEach et ParallelForEach. L'activité ForEach contient une liste de valeurs et un corps. Au moment de l'exécution, la liste fait l'objet d'une itération et le corps est exécuté pour chaque valeur de la liste.

ParallelForEach a un CompletionCondition afin que l'activité ParallelForEach puisse se terminer tôt si l'évaluation du CompletionCondition retourne la valeur true. Le CompletionCondition est évalué à l'issue de chaque itération.

Dans la plupart des cas, la version générique de l'activité doit être la solution par défaut, car elle couvre la plupart des scénarios dans lesquels elle est utilisée, et fournit la vérification des types au moment de la compilation. La version non générique peut être utilisée pour itérer au sein de types qui implémentent l'interface IEnumerable non générique.

Définition de classes

L'exemple de code suivant illustre la définition d'une activité ParallelForEach non générique.

[ContentProperty("Body")]
public class ParallelForEach : NativeActivity
{
    [RequiredArgument]
    [DefaultValue(null)]
    InArgument<IEnumerable> Values { get; set; }

    [DefaultValue(null)]
    [DependsOn("Values")]
    public Activity<bool> CompletionCondition
    [DefaultValue(null)]
    [DependsOn("CompletionCondition")]
    ActivityAction<object> Body { get; set; } 
}
  • Body (facultatif)
    ActivityAction de type Object, qui est exécuté pour chaque élément de la collection. Chaque élément individuel est passé dans le corps (Body) via sa propriété Argument.
  • Values (facultatif)
    Collection des éléments sur lesquels est effectuée l'itération. La vérification que tous les éléments de la collection sont de types compatibles est effectuée au moment de l'exécution.
  • CompletionCondition (facultatif)
    La propriété CompletionCondition est évaluée à l'issue de toute itération. Si sa valeur est true, les itérations en attente planifiées sont annulées. Si cette propriété n'est pas définie, toutes les activités de la collection Branches s'exécutent jusqu'à la fin.

Exemple d'utilisation de ParallelForEach

Le code suivant montre comment utiliser l'activité ParallelForEach dans une application.

string[] names = { "bill", "steve", "ray" };

DelegateInArgument<object> iterationVariable = new DelegateInArgument<object>() { Name = "iterationVariable" };

Activity sampleUsage =
    new ParallelForEach
    {
       Values = new InArgument<IEnumerable>(c=> names),
       Body = new ActivityAction<object> 
       {                        
           Argument = iterationVariable,
           Handler = new WriteLine
           {
               Text = new InArgument<string>(env => string.Format("Hello {0}",                                                               iterationVariable.Get(env)))
           }
       }
   };

Concepteur ParallelForEach

Le concepteur d'activités de l'exemple est semblable, en apparence, au concepteur fourni pour l'activité ParallelForEach intégrée. Le concepteur s'affiche dans la boîte à outils dans la catégorie Exemples, Activités non génériques. Le concepteur est nommé ParallelForEachWithBodyFactory dans la boîte à outils, car l'activité expose un IActivityTemplateFactory dans la boîte à outils, ce qui crée l'activité avec un ActivityAction correctement configuré.

public sealed class ParallelForEachWithBodyFactory : IActivityTemplateFactory
{
    public Activity Create(DependencyObject target)
    {
        return new Microsoft.Samples.Activities.Statements.ParallelForEach()
        {
            Body = new ActivityAction<object>()
            {
                Argument = new DelegateInArgument<object>()
                {
                    Name = "item"
                }
            }
        };
    }
}

Pour exécuter l'exemple

  1. Définissez le projet de votre choix comme projet de démarrage de la solution.

    1. CodeTestClient indique comment utiliser l'activité à l'aide du code.

    2. DesignerTestClient indique comment utiliser l'activité dans le concepteur.

  2. Générez et exécutez le projet.

Ee835856.Important(fr-fr,VS.100).gif Remarque :
Les exemples peuvent déjà être installés sur votre ordinateur. Recherchez le répertoire (par défaut) suivant avant de continuer.

<LecteurInstall>:\WF_WCF_Samples

Si ce répertoire n'existe pas, rendez-vous sur la page (éventuellement en anglais) des exemples Windows Communication Foundation (WCF) et Windows Workflow Foundation (WF) pour .NET Framework 4 pour télécharger tous les exemples Windows Communication Foundation (WCF) et WF. Cet exemple se trouve dans le répertoire suivant.

<LecteurInstall>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\NonGenericParallelForEach