Icke-generisk ParallelForEach
.NET Framework 4.6.1 levereras i sin verktygslåda med en uppsättning Control Flow-aktiviteter, inklusive ParallelForEach<T>, som gör det möjligt att iterera genom IEnumerable<T> samlingar.
ParallelForEach<T> kräver att dess Values egenskap är av typen IEnumerable<T>. Detta hindrar användare från att iterera över datastrukturer som implementerar IEnumerable<T> gränssnitt (till exempel ArrayList). Den icke-generiska versionen av ParallelForEach<T> övervinner det här kravet på bekostnad av mer körningskomplexitet för att säkerställa kompatibiliteten för typerna av värdena i samlingen.
Exemplet NonGenericParallelForEach visar hur du implementerar en icke-generisk ParallelForEach<T> aktivitet och dess designer. Den här aktiviteten kan användas för att iterera via ArrayList.
ParallelForEach-aktivitet
C#/Visual Basic-instruktionen foreach
räknar upp elementen i en samling och kör en inbäddad instruktion för varje element i samlingen. WF-motsvarande aktiviteter är ForEach<T> och ParallelForEach<T>. Aktiviteten ForEach<T> innehåller en lista med värden och en brödtext. Vid körningen itereras listan och brödtexten körs för varje värde i listan.
ParallelForEach<T> har en CompletionCondition, så att ParallelForEach<T> aktiviteten kan slutföras tidigt om utvärderingen av CompletionCondition returnerar true
. CompletionCondition Utvärderas efter att varje iteration har slutförts.
I de flesta fall bör den allmänna versionen av aktiviteten vara den bästa lösningen, eftersom den omfattar de flesta scenarier där den används och tillhandahåller typkontroll vid kompileringstillfället. Den icke-generiska versionen kan användas för iterering via typer som implementerar det icke-generiska IEnumerable gränssnittet.
Klassdefinition
I följande kodexempel visas definitionen av en icke-generisk ParallelForEach
aktivitet.
[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; }
}
Brödtext (valfritt)
Av ActivityAction typen Object, som körs för varje element i samlingen. Varje enskilt element skickas till brödtexten via dess argumentegenskap.
Värden (valfritt)
Samlingen med element som itereras över. Se till att alla element i samlingen är av kompatibla typer görs vid körning.
CompletionCondition (valfritt)
Egenskapen CompletionCondition utvärderas när iterationen har slutförts. Om den utvärderas till true
avbryts de schemalagda väntande iterationerna. Om den här egenskapen inte har angetts körs alla aktiviteter i samlingen Grenar tills den har slutförts.
Exempel på användning av ParallelForEach
Följande kod visar hur du använder aktiviteten ParallelForEach i ett program.
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-designer
Aktivitetsdesignern för exemplet liknar den designer som tillhandahålls för den inbyggda ParallelForEach<T> aktiviteten. Designern visas i verktygslådan i kategorin Exempel, icke-generiska aktiviteter . Designern heter ParallelForEachWithBodyFactory i verktygslådan eftersom aktiviteten exponerar en IActivityTemplateFactory i verktygslådan som skapar aktiviteten med en korrekt konfigurerad 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"
}
}
};
}
}
Så här kör du exemplet
Ange det projekt du väljer som startprojekt för lösningen.
CodeTestClient visar hur du använder aktiviteten med hjälp av kod.
DesignerTestClient visar hur du använder aktiviteten i designern.
Skapa och kör projektet.