Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
.NET Framework 4.6.1 comprend dans sa boîte à outils un ensemble d’activités de flux de contrôle, y compris ParallelForEach<T>, qui permet d’itérer à travers les collections IEnumerable<T>.
ParallelForEach<T> exige que sa Values propriété soit de type IEnumerable<T>. Cela empêche les utilisateurs d'itérer au sein des structures de données qui implémentent l'interface IEnumerable<T> (par exemple, ArrayList). La version non générique de ParallelForEach<T> surmonte cette exigence, au détriment d'une complexité d'exécution accrue pour garantir la compatibilité des types des valeurs dans la collection.
L’exemple NonGenericParallelForEach montre comment implémenter une activité non générique ParallelForEach<T> et son concepteur. Cette activité peut être utilisée pour itérer au sein de ArrayList.
Activité ParallelForEach
L’instruction C#/Visual Basic foreach énumère les éléments d’une collection, en exécutant une instruction incorporée pour chaque élément de la collection. Les activités WF équivalentes sont ForEach<T> et ParallelForEach<T>. L’activité ForEach<T> contient une liste de valeurs et un corps. Au moment de l’exécution, la liste est itérée et le corps de la fonction (ou de la boucle) est exécuté pour chaque valeur de la liste.
ParallelForEach<T> a un CompletionCondition, afin que l’activité ParallelForEach<T> puisse se terminer tôt si l’évaluation de CompletionCondition renvoie true. La CompletionCondition valeur est évaluée une fois chaque itération terminée.
Dans la plupart des cas, la version générique de l’activité doit être la solution préférée, car elle couvre la plupart des scénarios dans lesquels il est utilisé et fournit la vérification de type au moment de la compilation. La version non générique peut être utilisée pour effectuer une itération via des types qui implémentent l’interface non générique IEnumerable .
Définition de classe
L’exemple de code suivant montre la définition d’une activité non générique ParallelForEach .
[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 par le biais de sa propriété Argument.
Valeurs (facultatif)
Collection des éléments sur lesquels est effectuée l’itération. S’assurer que tous les éléments de la collection sont de types compatibles sont effectués au moment de l’exécution.
CompletionCondition (facultatif)
La CompletionCondition propriété est évaluée une fois l’itération terminée. Si l'évaluation donne true, alors 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 similaire à celui fourni pour l’activité intégrée ParallelForEach<T> . Le concepteur apparaît 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"
}
}
};
}
}
Exécution de l'exemple
Définissez le projet de votre choix comme projet de démarrage de la solution.
CodeTestClient montre comment utiliser l’activité à l’aide du code.
DesignerTestClient montre comment utiliser l’activité au sein du concepteur.
Générez et exécutez le projet.