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


Конструктор действия 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> действие, которое по умолчанию содержит значение DisplayNameParallelForEach<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>.

См. также