Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Rozhraní .NET Framework 4.6.1 je dodáváno se sadou nástrojů řídicích aktivit toku, včetně ParallelForEach<T>, které umožňuje iterování přes kolekce IEnumerable<T>.
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). Negenerická verze ParallelForEach<T> překonává tento požadavek, ovšem za cenu větší běhové složitosti při zajišťová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 přes 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. Za běhu se seznam iteruje a tělo se spustí pro každou hodnotu v seznamu.
ParallelForEach<T> má CompletionCondition, aby ParallelForEach<T> aktivita mohla být dokončena brzy, pokud vyhodnocení CompletionCondition vrátí true. Po dokončení každé iterace se vyhodnotí CompletionCondition.
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, jak je definována negenerická ParallelForEach aktivita.
[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; }
}
Tělo (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 své vlastnosti Argument.
Hodnoty (volitelné)
Kolekce prvků, které jsou iterovány. Zajištění, aby všechny prvky kolekce byly kompatibilních typů, se provádí za běhu programu.
Podmínka dokončení (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 Branches 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, Negenerické aktivity. Návrhář má v sadě nástrojů název ParallelForEachWithBodyFactory, protože aktivita v sadě nástrojů zpřístupňuje mechanismus, který vytvoří aktivitu se správně nakonfigurovanou IActivityTemplateFactory.
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.