Udostępnij za pomocą


Nieogólny ParallelForEach

Program .NET Framework 4.6.1 dostarczany jest z zestawem aktywności przepływu sterowania, w tym ParallelForEach<T>, który umożliwia iterowanie przez IEnumerable<T> kolekcji.

ParallelForEach<T> wymaga, aby jego właściwość Values była typu IEnumerable<T>. Uniemożliwia to użytkownikom iterowanie struktur danych implementujących IEnumerable<T> interfejs (na przykład ArrayList). Wersja niegeneryczna ParallelForEach<T> pokonuje to wymaganie, kosztem większej złożoności czasowej wykonywania, aby zapewnić zgodność typów wartości w kolekcji.

Przykład NonGenericParallelForEach pokazuje, jak zaimplementować działanie niegeneryczne ParallelForEach<T> i jego projektanta. To działanie może służyć do iterowania przez ArrayList.

Działanie ParallelForEach

Instrukcja języka C#/Visual Basic foreach wylicza elementy kolekcji, wykonując osadzoną instrukcję dla każdego elementu kolekcji. Równoważne działania WF to ForEach<T> i ParallelForEach<T>. Działanie ForEach<T> zawiera listę wartości i treść. W czasie wykonywania lista jest iterowana, a treść jest wykonywana dla każdej wartości na liście.

ParallelForEach<T> ma CompletionCondition, aby działanie ParallelForEach<T> mogło zostać ukończone wcześniej, jeśli ocena CompletionCondition zwróci true. Ocena CompletionCondition jest przeprowadzana po zakończeniu każdej iteracji.

W większości przypadków ogólna wersja działania powinna być preferowanym rozwiązaniem, ponieważ obejmuje większość scenariuszy, w których jest używana, i zapewnia sprawdzanie typów w czasie kompilacji. Wersja niegeneryczna może służyć do iterowania za pośrednictwem typów, które implementują interfejs niegeneryczny IEnumerable .

Definicja klasy

Poniższy przykład kodu pokazuje, czym jest definicja działania niegenerykowego ParallelForEach.

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

Treść (opcjonalnie)
ActivityAction typu Object, który jest wykonywany dla każdego elementu w kolekcji. Każdy pojedynczy element jest przekazywany do Ciała za pośrednictwem jego właściwości Argument.

Wartości (opcjonalnie)
Kolekcja elementów, po których się iteruje. Zapewnienie, że wszystkie elementy kolekcji są zgodne typy, są wykonywane w czasie wykonywania.

WarunekZakończenia (opcjonalnie)
Właściwość CompletionCondition jest oceniana po zakończeniu iteracji. Jeśli zostanie obliczona wartość true, zaplanowane iteracje oczekujące zostaną anulowane. Jeśli ta właściwość nie jest ustawiona, wszystkie działania w kolekcji Gałęzie są wykonywane do momentu ukończenia.

Przykład użycia metody ParallelForEach

Poniższy kod pokazuje, jak używać działania ParallelForEach w aplikacji.

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

projektant ParallelForEach

Projektant działań dla przykładu jest podobny do projektanta udostępnionego dla wbudowanego ParallelForEach<T> działania. Projektant pojawi się w przyborniku w kategorii Przykłady, Działania Inne Niż Ogólne. Projektant ma nazwę ParallelForEachWithBodyFactory w przyborniku, ponieważ działanie uwidacznia IActivityTemplateFactory element w przyborniku, który tworzy działanie z prawidłowo skonfigurowanym ActivityActionelementem .

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

Aby uruchomić przykład

  1. Ustaw wybrany projekt jako projekt startowy rozwiązania.

    1. CodeTestClient pokazuje, jak używać działania przy użyciu kodu.

    2. DesignerTestClient pokazuje, jak używać działania w projektancie.

  2. Skompiluj i uruchom projekt.