Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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
Ustaw wybrany projekt jako projekt startowy rozwiązania.
CodeTestClient pokazuje, jak używać działania przy użyciu kodu.
DesignerTestClient pokazuje, jak używać działania w projektancie.
Skompiluj i uruchom projekt.