Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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
Állítsa be a választott projektet a megoldás indítási projektjeként.
A CodeTestClient bemutatja, hogyan használhatja a tevékenységet kóddal.
A DesignerTestClient bemutatja, hogyan használhatja a tevékenységet a tervezőn belül.
Hozza létre és futtassa a projektet.