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
Nastavte projekt podle svého výběru jako spouštěný projekt řešení.
CodeTestClient ukazuje, jak používat aktivitu pomocí kódu.
DesignerTestClient ukazuje, jak používat aktivitu v návrháři.
Sestavte a spusťte projekt.