Поделиться через


Нестандартное действие ParallelForEach

Данный раздел относится к версии Windows Workflow Foundation 4.

В область элементов .NET Framework, версия 4 входит набор действий потока управления, включая элемент ParallelForEach, который позволяет проходить по коллекциям IEnumerable.

Свойство Values элемента ParallelForEach должно иметь тип IEnumerable. Это запрещает пользователям проходить по структурам данных, в которых реализован интерфейс IEnumerable (например, ArrayList). Неуниверсальная версия ParallelForEach выполняет это требование за счет большей гибкости во время выполнения, чтобы обеспечить совместимость типов значений в коллекции.

В этом образце показано, как реализовать неуниверсальное действие ParallelForEach и конструктор для него. Это действие позволяет проходить по ArrayList.

Действие ParallelForEach

Оператор foreach в C# и Visual Basic перечисляет элементы коллекции, выполняя внедренные в цикле операторы для каждого элемента в коллекции. Эквивалентными действиями WF являются действия ForEach и ParallelForEach. Действие ForEach содержит список значений и содержимое. Во время выполнения действие проходит по списку, и текст действия выполняется для каждого значения в списке.

ParallelForEach имеет CompletionCondition, поэтому действие ParallelForEach может завершиться рано, если оценка CompletionCondition вернет результат true. Свойство CompletionCondition вычисляется после завершения каждой итерации.

Для большинства случаев универсальная версия действия является предпочтительным вариантом, поскольку он охватывает большинство сценариев, в которых используется действие, и предоставляет проверку соответствия типов во время компиляции. Неуниверсальная версия позволяет проходить по типам, где реализован неуниверсальный интерфейс IEnumerable.

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

В следующем примере кода показано определение неуниверсального действия 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; } 
}
  • Содержание (необязательно)
    Действие ActivityAction типа Object, которое выполняется для каждого элемента в коллекции. Каждый отдельный элемент передается в текст через свойство Argument.
  • Значения (необязательно)
    Коллекция элементов, по которой выполняется проход. Проверка совместимости типов для всех элементов коллекции проводится во время выполнения.
  • CompletionCondition (по выбору)
    Свойство CompletionCondition вычисляется после завершения каждой итерации. Если результат оценки равен true, то запланированные ожидающие итерации отменяются. Если это свойство не задано, все действия в коллекции ветвей выполняются до завершения.

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

В следующем коде демонстрируется использование в приложении действия ParallelForEach.

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

Конструктор действий для образца аналогичен конструктору, предоставляемому для встроенного действия ParallelForEach. Конструктор выводится в области элементов Образцы, категория Неуниверсальные действия. Конструктор на панели инструментов называется ParallelForEachWithBodyFactory, поскольку это действие предоставляет на панели инструментов объект IActivityTemplateFactory с настроенным действием 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"
                }
            }
        };
    }
}

Выполнение образца

  1. Установите выбранный проект в качестве проекта для запуска решения.

    1. В образце CodeTestClient показано использование действия в коде.

    2. В образце DesignerTestClient показано использование действия в конструкторе.

  2. Постройте и запустите проект.

Ee835856.Important(ru-ru,VS.100).gif Примечание
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).

<диск_установки>:\WF_WCF_Samples

Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.

<диск_установки>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\NonGenericParallelForEach