ParallelForEach (nicht generisch)
Zur Toolbox von .NET Framework 4.6.1 gehören Ablaufsteuerungsaktivitäten, einschließlich ParallelForEach<T>, die das Durchlaufen von IEnumerable<T>-Auflistungen ermöglichen.
Für ParallelForEach<T> muss die Values-Eigenschaft den Typ IEnumerable<T> aufweisen. Dies schließt Benutzer davon aus, Datenstrukturen zu durchlaufen, die die IEnumerable<T>-Schnittstelle implementieren (z. B. ArrayList). Die nicht generische Version von ParallelForEach<T> bewältigt diese Anforderung zulasten einer größeren Laufzeitkomplexität zum Sicherstellen der Kompatibilität der Typen der Werte in der Auflistung.
In diesem NonGenericParallelForEach-Beispiel wird gezeigt, wie eine nicht generische ParallelForEach<T>-Aktivität und der Designer implementiert werden. Diese Aktivität kann zum Durchlaufen von ArrayList verwendet werden.
ParallelForEach-Aktivität
Die C#/Visual Basic-Anweisung foreach
zählt die Elemente einer Auflistung auf und führt eine eingebettete Anweisung für jedes Element der Auflistung aus. Die entsprechenden WF-Aktivitäten sind ForEach<T> und ParallelForEach<T>. Die ForEach<T>-Aktivität enthält eine Liste von Werten und einen Text. Zur Runtime wird die Liste durchlaufen, und der Text wird für jeden Wert in der Liste ausgeführt.
ParallelForEach<T> weist eine CompletionCondition auf, damit die ParallelForEach<T>-Aktivität vorzeitig abgeschlossen werden kann, wenn die Auswertung der CompletionConditiontrue
zurückgibt. Die CompletionCondition wird nach dem Abschluss jeder Iteration ausgewertet.
In den meisten Fällen sollte die generische Version der Aktivität die bevorzugte Lösung sein, da die meisten Szenarien, in denen sie verwendet wird, damit abgedeckt werden und sie zur Kompilierzeit eine Typüberprüfung bietet. Die nicht generische Version kann zum Durchlaufen von Typen, die die nicht generische IEnumerable-Schnittstelle implementieren, verwendet werden.
Klassendefinition
Im folgenden Codebeispiel wird die Definition einer nicht generischen ParallelForEach
-Aktivität veranschaulicht.
[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; }
}
Text (optional)
Das ActivityAction-Element mit dem Typ Object, das für jedes Element in der Auflistung ausgeführt wird. Jedes einzelne Element wird durch die Argument-Eigenschaft in den Text übergeben.
Werte (optional)
Die Auflistung von Elementen, die durchlaufen werden. Die Sicherstellung, dass alle Elemente der Auflistung kompatible Typen aufweisen, erfolgt zur Laufzeit.
CompletionCondition (optional)
Die CompletionCondition-Eigenschaft wird ausgewertet, nachdem eine Iteration abgeschlossen wurde. Ergibt die Auswertung true
, werden die geplanten ausstehenden Iterationen abgebrochen. Wenn diese Eigenschaft nicht festgelegt ist, werden alle Aktivitäten in der Branchauflistung bis zur Beendigung ausgeführt.
Beispiel für die Verwendung von ParallelForEach
Im folgenden Code wird veranschaulicht, wie die ParallelForEach-Aktivität in einer Anwendung verwendet wird.
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
Der Aktivitätsdesigner für das Beispiel ist dem Designer im Aussehen ähnlich, der für die integrierte ParallelForEach<T>-Aktivität dient. Der Designer wird in der Toolbox unter Beispiele, Kategorie Nicht generische Aktivitäten, angezeigt. Der Designer wird in der Toolbox ParallelForEachWithBodyFactory genannt, da die Aktivität ein IActivityTemplateFactory-Element in der Toolbox verfügbar macht, das die Aktivität mit einem ordnungsgemäß konfigurierten ActivityAction-Element erstellt.
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"
}
}
};
}
}
So führen Sie das Beispiel aus
Legen Sie das Projekt Ihrer Wahl als Startprojekt der Projektmappe fest:
CodeTestClient zeigt, wie die Aktivität mit Code verwendet wird.
DesignerTestClient zeigt, wie die Aktivität im Designer verwendet wird.
Erstellen Sie das Projekt, und führen Sie es aus.