Sdílet prostřednictvím


Ne generický parallelForEach

Rozhraní .NET Framework 4.6.1 se dodává v sadě nástrojů sady aktivit toku řízení, včetně ParallelForEach<T>, které umožňuje iterování prostřednictvím IEnumerable<T> kolekcí.

ParallelForEach<T> vyžaduje, aby jeho Values vlastnost byla typu IEnumerable<T>. To brání uživatelům v iterování datových struktur, které implementují IEnumerable<T> rozhraní (například ArrayList). Ne generická verze ParallelForEach<T> tohoto požadavku tento požadavek překonat, a to na úkor větší složitosti za běhu pro zajištění kompatibility typů hodnot v kolekci.

Ukázka NonGenericParallelForEach ukazuje, jak implementovat negenerickou ParallelForEach<T> aktivitu a jeho návrháře. Tuto aktivitu lze použít k iteraci .ArrayList

Aktivita ParallelForEach

Příkaz C#/Visual Basic foreach vyčíslí prvky kolekce a spustí vložený příkaz pro každý prvek kolekce. Ekvivalentní činnosti WF jsou ForEach<T> a ParallelForEach<T>. Aktivita ForEach<T> obsahuje seznam hodnot a tělo. V době běhu se seznam iterated a text se spustí pro každou hodnotu v seznamu.

ParallelForEach<T> má , CompletionConditionaby ParallelForEach<T> aktivita mohla být dokončena brzy, pokud vyhodnocení CompletionCondition vrácení true. Vyhodnotí se CompletionCondition po dokončení každé iterace.

Ve většině případů by obecná verze aktivity měla být upřednostňovaným řešením, protože pokrývá většinu scénářů, ve kterých se používá, a poskytuje kontrolu typů v době kompilace. Ne generická verze se dá použít k iterování prostřednictvím typů, které implementují ne generické IEnumerable rozhraní.

Definice třídy

Následující příklad kódu ukazuje definici ne generické ParallelForEach aktivity je.

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

Text (volitelné)
Typ ActivityActionObject, který se spustí pro každý prvek v kolekci. Každý jednotlivý prvek je předán do Body prostřednictvím jeho Argument vlastnost.

Hodnoty (volitelné)
Kolekce prvků, které jsou iterated. Zajištění, aby všechny prvky kolekce byly kompatibilní typy provedeny za běhu.

CompletionCondition (volitelné)
Vlastnost CompletionCondition se vyhodnotí po dokončení iterace. Pokud se vyhodnotí jako true, naplánované čekající iterace se zruší. Pokud tato vlastnost není nastavena, všechny aktivity v kolekci Větví se spustí až do dokončení.

Příklad použití ParallelForEach

Následující kód ukazuje použití aktivity ParallelForEach v aplikaci.

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

Návrhář ParallelForEach

Návrhář aktivity pro ukázku se podobá návrháři poskytovanému pro integrovanou ParallelForEach<T> aktivitu. Návrhář se zobrazí v sadě nástrojů v kategorii Ukázky, Ne generické aktivity . Návrhář má v sadě nástrojů název ParallelForEachWithBodyFactory , protože aktivita zveřejňuje IActivityTemplateFactory v sadě nástrojů aktivitu, která vytvoří aktivitu s správně nakonfigurovanou ActivityAction.

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

Chcete-li spustit ukázku

  1. Nastavte projekt podle svého výběru jako spouštěný projekt řešení.

    1. CodeTestClient ukazuje, jak používat aktivitu pomocí kódu.

    2. DesignerTestClient ukazuje, jak používat aktivitu v návrháři.

  2. Sestavte a spusťte projekt.