Nem általános ParallelForEach

A .NET Framework 4.6.1 az eszközkészletében tartalmaz egy sor kontrollfolyamat-tevékenységet, beleértve olyan lehetőséget is, amely lehetővé teszi a ParallelForEach<T> gyűjteményeken való IEnumerable<T> iterálást.

ParallelForEach<T> tulajdonságának Values típusnak IEnumerable<T>kell lennie. Ez megakadályozza, hogy a felhasználók az interfészt implementáló IEnumerable<T> adatstruktúrákon (például ArrayList) iteráljanak. A nem generikus verzió ParallelForEach<T> leküzdi ezt a követelményt, de ez a gyűjteményben lévő értékek típusainak kompatibilitásának biztosítása érdekében nagyobb futásidejű összetettséggel jár.

A NonGenericParallelForEach minta bemutatja, hogyan valósítható meg egy nem általános ParallelForEach<T> tevékenység és annak tervezője. Ezzel a tevékenységsel iterálható a ArrayListművelet.

ParallelForEach tevékenység

A C#/Visual Basic foreach utasítás számba foglalja a gyűjtemény elemeit, és beágyazott utasítást hajt végre a gyűjtemény minden eleméhez. A WF-ekvivalens tevékenységek: ForEach<T> és ParallelForEach<T>. A ForEach<T> tevékenység egy értéklistát és tartalmat tartalmaz. Futásidőben a lista iterálódik, és a rendszer végrehajtja a törzset a lista minden egyes értékéhez.

ParallelForEach<T> rendelkezik CompletionCondition-vel, hogy a ParallelForEach<T> tevékenység korábban befejeződhessen, ha a CompletionCondition kiértékelése true eredményez. A CompletionCondition kiértékelés az egyes iterációk befejezése után történik.

A legtöbb esetben a tevékenység általános verziójának kell lennie az előnyben részesített megoldásnak, mivel a legtöbb forgatókönyvet lefedi, és fordításkor típusellenőrzést biztosít. A nem általános verzió használható a nem általános IEnumerable felületet implementáló típusok iterálásához.

Osztálydefiníció

Az alábbi példakód egy nem általános ParallelForEach tevékenység definícióját mutatja be.

[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örzs (nem kötelező)
A ActivityAction gyűjtemény minden eleméhez végrehajtott típus Object. Minden egyes elem az Argumentum tulajdonságán keresztül kerül be a törzsbe.

Értékek (nem kötelező)
Az iterált elemek gyűjteménye. Annak biztosítása, hogy a gyűjtemény minden eleme kompatibilis típusok legyenek, futásidőben történik.

BefejezésiFeltétel (nem kötelező)
A CompletionCondition tulajdonság kiértékelése az iteráció befejeződése után történik. Ha true-re értékelődik, akkor az ütemezett függőben lévő iterációk törlődnek. Ha ez a tulajdonság nincs megadva, az ágak gyűjtemény összes tevékenysége végrehajtódik a befejezésig.

Példa a ParallelForEach használatára

Az alábbi kód bemutatja, hogyan használható a ParallelForEach-tevékenység egy alkalmazásban.

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

A minta tevékenységtervezője hasonló megjelenésű, mint a beépített ParallelForEach<T> tevékenységhez megadott tervező. A tervező megjelenik az eszközkészletben a Minták, nem általános tevékenységek kategóriában. A tervező neve ParallelForEachWithBodyFactory az eszközkészletben, mert a tevékenység egy IActivityTemplateFactory elemet tesz elérhetővé az eszközkészletben, amely a tevékenységet megfelelően konfigurált módon ActivityAction hozza létre.

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

Minta futtatása

  1. Állítsa be a választott projektet a megoldás indítási projektjeként.

    1. A CodeTestClient bemutatja, hogyan használhatja a tevékenységet kóddal.

    2. A DesignerTestClient bemutatja, hogyan használhatja a tevékenységet a tervezőn belül.

  2. Hozza létre és futtassa a projektet.