Freigeben über


ParallelForEach (nicht generisch)

.NET Framework 4.6.1 enthält in seiner Toolbox eine Reihe von Kontrollflussaktivitäten, einschließlich ParallelForEach<T>, die das Iterieren durch IEnumerable<T> Kollektionen ermöglichen.

ParallelForEach<T> erfordert, dass die Values Eigenschaft vom Typ IEnumerable<T>ist. Dies hindert Benutzer daran, Datenstrukturen zu durchlaufen, die die Schnittstelle IEnumerable<T> implementieren (z. B. ArrayList). Die nicht generische Version dieser ParallelForEach<T> Anforderung überwindet diese Anforderung auf Kosten einer größeren Laufzeitkomplexität, um die Kompatibilität der Typen der Werte in der Auflistung sicherzustellen.

Im Beispiel "NonGenericParallelForEach" wird gezeigt, wie eine nicht generische ParallelForEach<T> Aktivität und ihr Designer implementiert werden. Diese Aktivität kann zum Durchlaufen von ArrayList verwendet werden.

ParallelForEach-Aktivität

Die C#/Visual Basic-Anweisung foreach listet die Elemente einer Auflistung auf und führt eine eingebettete Anweisung für jedes Element der Auflistung aus. Die WF-äquivalenten Aktivitäten sind ForEach<T> und ParallelForEach<T>. Die ForEach<T> Aktivität enthält eine Liste von Werten und einen Inhalt. Zur Laufzeit wird die Liste durchlaufen, und der Textkörper 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 sie die meisten Szenarien abdeckt, in denen sie verwendet wird, und die Typüberprüfung zur Kompilierungszeit bereitstellt. Die nicht generische Version kann zum Durchlaufen von Typen verwendet werden, die die nicht generische IEnumerable Schnittstelle implementieren.

Klassendefinition

Das folgende Codebeispiel zeigt die Definition einer nicht generischen ParallelForEach Aktivität.

[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. Das Sicherstellen, dass alle Elemente der Sammlung kompatible Typen haben, erfolgt zur Laufzeit.

Abschlussbedingung (optional)
Die CompletionCondition Eigenschaft wird nach Abschluss einer Iteration ausgewertet. Wenn es auf true ausgewertet wird, 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

Der folgende Code veranschaulicht die Verwendung der ParallelForEach-Aktivität in einer Anwendung.

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

Der Aktivitäts-Designer für das Beispiel ähnelt dem Designer, der für die integrierte ParallelForEach<T>-Aktivität bereitgestellt wurde. Der Designer wird in der Toolbox in der Kategorie "Beispiele", " 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

  1. Setze das Projekt deiner Wahl als Startprojekt der Lösung.

    1. CodeTestClient zeigt, wie die Aktivität mithilfe von Code verwendet wird.

    2. DesignerTestClient zeigt, wie die Aktivität innerhalb des Designers verwendet wird.

  2. Erstellen Sie das Projekt, und führen Sie es aus.