Конструктор действия ParallelForEach
Действие ParallelForEach<T> перечисляет элементы коллекции и выполняет вложенную инструкцию для каждого элемента коллекции параллельно, асинхронно в том же потоке. Это действие управления потоком следует использовать вместо действия Sequence, если ожидается, что вложенные действия перейдут в режим бездействия.
Действие ParallelForEach<T> имеет CompletionCondition свойство, содержащее указанное пользователем выражение Visual Basic. Действие ParallelForEach<T> вычисляет это свойство после завершения каждой ветви кода. Если значение равно true, ParallelForEach<T> действие завершается без выполнения других ветвей. Если значение CompletionCondition не соответствует true, ParallelForEach<T> действие завершается после завершения всех дочерних действий.
Действие ParallelForEach<T>
ParallelForEach<T> перечисляет значения и планирует для каждого значения, на которое оно перечисляется Body . Планируются только Body. Выполнение тела зависит от перехода Body в состояние простоя.
Если Body не переходит в состояние простоя, то выполнение производится в обратном порядке, так как запланированные действия помещаются в стек, то есть последнее запланированное действие выполняется первым. Например, если у вас есть коллекция {1,2,3,4}ParallelForEach<T> и используйте WriteLine в качестве текста для записи значения. В консоли есть 4, 3, 2, 1. Это связано с тем, что WriteLine не проходит бездействия, поэтому после 4 действий WriteLine было запланировано, они выполняли стек поведение (сначала в последнем выходе).
Но если в Body имеются действия, которые могут перейти в состояние простоя, например Receive или Delay, Нет необходимости ожидать их завершения. ParallelForEach<T> переходит к следующему запланированному действию текста и пытается выполнить его. Если и это действие перешло в режим простоя, то ParallelForEach<T> опять переходит к следующему действию тела.
Использование конструктора действий ParallelForEach<T>
Доступ к конструктору действий ParallelForEach<T> в категории потока управления панели элементов.
Конструктор действий ParallelForEach<T> можно перетаскивать из панели элементов и перемещаться на поверхность конструктора рабочих процессов, где обычно размещаются конструкторы действий, например внутри конструктора действий последовательности . После удаления в конструктор рабочих процессов он создает ParallelForEach<T> действие, которое по умолчанию содержит значение DisplayName ParallelForEach<Int32>.
Свойства ParallelForEach<T> в конструкторе рабочих процессов
В следующей таблице показаны свойства действия ParallelForEach<T>, которые применяются чаще всего, а также приводится описание их использования в конструкторе.
Имя свойства | Обязательное поле | Использование |
---|---|---|
DisplayName | False | Указывает понятное отображаемое имя действия конструктора в заголовке. Значением по умолчанию является ParallelForEach<Int32>. Значение может быть дополнительно изменено в сетке свойств или непосредственно в заголовке конструктора действий. |
Body | False | Действие, выполняемое для каждого элемента в коллекции. Чтобы добавить действие, удалите действие из панели элементов в поле "Текст" Body в конструкторе действий ParallelForEach<T> с текстом подсказки "Удалить действие здесь". |
TypeArgument | Истина | Тип элементов в Values коллекции, указанной универсальным параметром T. По умолчанию типArgument имеет значение Int32. Чтобы изменить тип T в конструкторе действий ParallelForEach<T>, измените значение поля со списком TypeArgument в сетке свойств. |
Values | Истина | Коллекция элементов для итерации. Чтобы задать Valuesзначение, введите выражение Visual Basic в поле "Значения" в конструкторе действий ForEach<T> в поле с текстом подсказки "Ввод выражения VB" или в поле "Значения" в окне "Свойства". |
CompletionCondition | Оценивается после каждого выполнения итерации. Если результат оценки равен true, то запланированные ожидающие итерации отменяются. Если это свойство не задано, все запланированные инструкции выполняются до завершения. |
По умолчанию итератор цикла является именованным элементом. Имя переменной итератора можно изменить в поле ForEach в конструкторе действий ParallelForEach<T> . Цикличный итератор можно использовать в выражениях в дочерних действиях действия ParallelForEach<T>.