Не универсальный ParallelForEachNon-generic ParallelForEach

В область элементов .NET Framework 4.6.1.NET Framework 4.6.1 входит набор действий потока управления, включая элемент ParallelForEach<T>, который позволяет проходить по коллекциям IEnumerable<T>..NET Framework 4.6.1.NET Framework 4.6.1 ships in its toolbox a set of Control Flow activities, including ParallelForEach<T>, which allows iterating through IEnumerable<T> collections.

ParallelForEach<T> свойство должно Values иметь значение типа IEnumerable<T> .ParallelForEach<T> requires its Values property to be of type IEnumerable<T>. Это запрещает пользователям проходить по структурам данных, в которых реализован интерфейс IEnumerable<T> (например, ArrayList).This precludes users from iterating over data structures that implement IEnumerable<T> interface (for example, ArrayList). Неуниверсальная версия ParallelForEach<T> выполняет это требование за счет большей гибкости во время выполнения, чтобы обеспечить совместимость типов значений в коллекции.The non-generic version of ParallelForEach<T> overcomes this requirement, at the expense of more run-time complexity for ensuring the compatibility of the types of the values in the collection.

В этом образце показано, как реализовать неуниверсальное действие ParallelForEach<T> и конструктор для него.This sample shows how to implement a non-generic ParallelForEach<T> activity and its designer. Это действие позволяет проходить по ArrayList.This activity can be used to iterate through ArrayList.

Действие ParallelForEachParallelForEach activity

Инструкция C#/Visual Basic foreach перечисляет элементы коллекции, выполняя внедренный оператор для каждого элемента коллекции.The C#/Visual Basic foreach statement enumerates the elements of a collection, executing an embedded statement for each element of the collection. Эквивалентными действиями WFWF являются действия ForEach<T> и ParallelForEach<T>.The WFWF equivalent activities are ForEach<T> and ParallelForEach<T>. Действие ForEach<T> содержит список значений и содержимое.The ForEach<T> activity contains a list of values and a body. Во время выполнения действие проходит по списку, и текст действия выполняется для каждого значения в списке.At runtime, the list is iterated and the body is executed for each value in the list.

ParallelForEach<T> имеет CompletionCondition, поэтому действие ParallelForEach<T> может завершиться рано, если оценка CompletionCondition вернет результат true.ParallelForEach<T> has a CompletionCondition, so that the ParallelForEach<T> activity could complete early if the evaluation of the CompletionCondition returns true. Свойство CompletionCondition вычисляется после завершения каждой итерации.The CompletionCondition is evaluated after each iteration is completed.

Для большинства случаев универсальная версия действия является предпочтительным вариантом, поскольку он охватывает большинство сценариев, в которых используется действие, и предоставляет проверку соответствия типов во время компиляции.For most cases, the generic version of the activity should be the preferred solution, because it covers most of the scenarios in which it is used and provides type checking at compile time. Неуниверсальная версия позволяет проходить по типам, где реализован неуниверсальный интерфейс IEnumerable.The non-generic version can be used for iterating through types that implement the non-generic IEnumerable interface.

Определение классаClass definition

В следующем примере кода показано определение неуниверсального действия ParallelForEach.The following code example shows the definition of a non-generic ParallelForEach activity is.

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

Текст (необязательно) Body (optional)
Действие ActivityAction типа Object, которое выполняется для каждого элемента в коллекции.The ActivityAction of type Object, which is executed for each element in the collection. Каждый отдельный элемент передается в текст через свойство Argument.Each individual element is passed into the Body through its Argument property.

Значения (необязательно) Values (optional)
Коллекция элементов, по которой выполняется проход.The collection of elements that are iterated over. Проверка совместимости типов для всех элементов коллекции проводится во время выполнения.Ensuring that all elements of the collection are of compatible types is done at run-time.

Комплетионкондитион (необязательно) CompletionCondition (optional)
Свойство CompletionCondition вычисляется после завершения каждой итерации.The CompletionCondition property is evaluated after any iteration completes. Если результат оценки равен true, то запланированные ожидающие итерации отменяются.If it evaluates to true, then the scheduled pending iterations are canceled. Если это свойство не задано, все действия в коллекции ветвей выполняются до завершения.If this property is not set, all activities in the Branches collection execute until completion.

Пример использования ParallelForEachExample of using ParallelForEach

В следующем коде демонстрируется использование в приложении действия ParallelForEach.The following code demonstrates how to use the ParallelForEach activity in an application.

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

Конструктор ParallelForEachParallelForEach designer

Конструктор действий для образца аналогичен конструктору, предоставляемому для встроенного действия ParallelForEach<T>.The activity designer for the sample is similar in appearance to the designer provided for the built-in ParallelForEach<T> activity. Конструктор появится в области элементов в категории примеры, неуниверсальные действия .The designer appears in the toolbox in the Samples, Non-Generic Activities category. Конструктор именуется параллелфореачвисбодифактори на панели элементов, так как действие предоставляет IActivityTemplateFactory в панели элементов объект, который создает действие с правильной настройкой ActivityAction .The designer is named ParallelForEachWithBodyFactory in the toolbox, because the activity exposes an IActivityTemplateFactory in the toolbox that creates the activity with a properly configured 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"
                }
            }
        };
    }
}

Выполнение образцаTo run the sample

  1. Установите выбранный проект в качестве проекта для запуска решения.Set the project of your choice as the startup project of the solution.

    1. Кодетестклиент показывает, как использовать действие с помощью кода.CodeTestClient shows how to use the activity using code.

    2. Десигнертестклиент показывает, как использовать действие в конструкторе.DesignerTestClient shows how to use the activity within the designer.

  2. Постройте и запустите проект.Build and run the project.

Важно!

Образцы уже могут быть установлены на компьютере.The samples may already be installed on your machine. Перед продолжением проверьте следующий каталог (по умолчанию).Check for the following (default) directory before continuing.

<InstallDrive>:\WF_WCF_Samples

Если этот каталог не существует, перейдите к примерам Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для платформа .NET Framework 4 , чтобы скачать все Windows Communication Foundation (WCF) и WFWF примеры.If this directory does not exist, go to Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4 to download all Windows Communication Foundation (WCF) and WFWF samples. Этот образец расположен в следующем каталоге.This sample is located in the following directory.

<InstallDrive>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\NonGenericParallelForEach