Delen via


Niet-algemeen ParallelForEach

.NET Framework 4.6.1 wordt geleverd in de werkset van een set controlestroomactiviteiten, waaronder ParallelForEach<T>, waarmee verzamelingen kunnen worden herhaald IEnumerable<T> .

ParallelForEach<T> vereist dat de Values eigenschap van het type IEnumerable<T>is. Dit voorkomt dat gebruikers itereren over gegevensstructuren die interface implementeren IEnumerable<T> (bijvoorbeeld ArrayList). De niet-algemene versie van ParallelForEach<T> deze vereiste overkomt deze vereiste, ten koste van meer runtimecomplexiteit om ervoor te zorgen dat de typen waarden in de verzameling compatibel zijn.

Het voorbeeld NonGenericParallelForEach laat zien hoe u een niet-algemene ParallelForEach<T> activiteit en de ontwerpfunctie implementeert. Deze activiteit kan worden gebruikt om door te gaan ArrayList.

ParallelForEach-activiteit

Met de instructie C#/Visual Basic foreach worden de elementen van een verzameling opgesomd, waarbij een ingesloten instructie wordt uitgevoerd voor elk element van de verzameling. De gelijkwaardige WF-activiteiten zijn ForEach<T> en ParallelForEach<T>. De ForEach<T> activiteit bevat een lijst met waarden en een hoofdtekst. Tijdens runtime wordt de lijst curseerd en wordt de hoofdtekst uitgevoerd voor elke waarde in de lijst.

ParallelForEach<T> heeft een CompletionCondition, zodat de ParallelForEach<T> activiteit vroeg kan worden voltooid als de evaluatie van de CompletionCondition retourzendingen true. De CompletionCondition wordt geëvalueerd nadat elke iteratie is voltooid.

In de meeste gevallen moet de algemene versie van de activiteit de voorkeursoplossing zijn, omdat deze de meeste scenario's omvat waarin deze wordt gebruikt en typecontrole op het moment van compileren biedt. De niet-algemene versie kan worden gebruikt voor het doorlopen van typen die de niet-algemene IEnumerable interface implementeren.

Klassedefinitie

In het volgende codevoorbeeld ziet u de definitie van een niet-algemene ParallelForEach activiteit.

[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; }
}

Hoofdtekst (optioneel)
Het ActivityAction type Object, dat wordt uitgevoerd voor elk element in de verzameling. Elk afzonderlijk element wordt doorgegeven aan de hoofdtekst via de eigenschap Argument.

Waarden (optioneel)
De verzameling elementen die worden ge curseerd. Ervoor zorgen dat alle elementen van de verzameling van compatibele typen worden uitgevoerd tijdens runtime.

CompletionCondition (optioneel)
De CompletionCondition eigenschap wordt geëvalueerd nadat een iteratie is voltooid. Als dit wordt geëvalueerd true, worden de geplande iteraties die in behandeling zijn, geannuleerd. Als deze eigenschap niet is ingesteld, worden alle activiteiten in de verzameling Branches uitgevoerd totdat ze zijn voltooid.

Voorbeeld van het gebruik van ParallelForEach

De volgende code laat zien hoe u de ParallelForEach-activiteit in een toepassing gebruikt.

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)))
           }
       }
   };

ParallelForEach Designer

De activiteitsontwerper voor het voorbeeld is vergelijkbaar met de ontwerpfunctie die is opgegeven voor de ingebouwde ParallelForEach<T> activiteit. De ontwerpfunctie wordt weergegeven in de werkset in de categorie Samples, Non-Generic Activities . De ontwerper heet ParallelForEachWithBodyFactory in de werkset, omdat de activiteit een IActivityTemplateFactory in de werkset beschikbaar maakt waarmee de activiteit wordt gemaakt met een correct geconfigureerde ActivityActionactiviteit.

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"
                }
            }
        };
    }
}

Het voorbeeld uitvoeren

  1. Stel het project van uw keuze in als het opstartproject van de oplossing.

    1. CodeTestClient laat zien hoe u de activiteit gebruikt met behulp van code.

    2. DesignerTestClient laat zien hoe u de activiteit in de ontwerpfunctie gebruikt.

  2. Maak het project en voer het uit.