Sdílet prostřednictvím


Ne generický parallelForEach

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>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

  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.