Compartilhar via


ParallelForEach não genérico

O .NET Framework 4.6.1 envia na caixa de ferramentas um conjunto de atividades de Fluxo de Controle, incluindo ParallelForEach<T>, que permite iterar através das coleções IEnumerable<T>.

ParallelForEach<T> requer que sua Values propriedade seja do tipo IEnumerable<T>. Isso evita que usuários de iterar sobre as estruturas de dados que implementam a interface de IEnumerable<T> (por exemplo, ArrayList). A versão não genérica de ParallelForEach<T> supera esse requisito, em detrimento de mais complexidade de runtime para garantir a compatibilidade dos tipos dos valores na coleção.

O exemplo NonGenericParallelForEach mostra como implementar uma atividade não genérica ParallelForEach<T> e seu designer. Esta atividade pode ser usada para percorrer ArrayList.

Atividade ParallelForEach

A instrução C#/Visual Basic foreach enumera os elementos de uma coleção, executando uma instrução inserida para cada elemento da coleção. As atividades equivalentes do WF são ForEach<T> e ParallelForEach<T>. A atividade ForEach<T> contém uma lista de valores e um conteúdo. Em runtime, a lista é iterada e o corpo é executado para cada valor na lista.

ParallelForEach<T> tem CompletionCondition, de modo que a atividade de ParallelForEach<T> pode concluir no início se a avaliação de CompletionCondition retorna true. O CompletionCondition valor é avaliado após a conclusão de cada iteração.

Para a maioria dos casos, a versão genérica da atividade deve ser a solução preferencial, pois abrange a maioria dos cenários em que ela é usada e fornece verificação de tipo em tempo de compilação. A versão não genérica pode ser usada para iteração por meio de tipos que implementam a interface não genérica IEnumerable .

Definição de classe

O exemplo de código a seguir mostra a definição de uma atividade não genérica 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; }
}

Corpo (opcional)
ActivityAction de tipo Object, que é executado para cada elemento na coleção. Cada elemento individual é passado no Body por meio de sua propriedade Argument.

Valores (opcional)
A coleção de elementos que são iterados sobre. Garantir que todos os elementos da coleção sejam de tipos compatíveis é feito em runtime.

Condição de Conclusão (opcional)
A CompletionCondition propriedade é avaliada após a conclusão de qualquer iteração. Se ele for avaliado como true, as iterações pendentes agendadas serão canceladas. Se esta propriedade não for definida, todas as atividades na coleção de ramificações executam até a conclusão.

Exemplo de como usar ParallelForEach

O código a seguir demonstra como usar a atividade ParallelForEach em um aplicativo.

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

Designer de ParallelForEach

O designer de atividade para o exemplo é semelhante a aparência ao designer fornecido para atividades interno de ParallelForEach<T> . O designer aparece na caixa de ferramentas na categoria Exemplos, Atividades Não Genéricas. O designer é chamado de ParallelForEachWithBodyFactory na caixa de ferramentas porque a atividade expõe IActivityTemplateFactory na caixa de ferramentas que cria a atividade com uma ActivityAction configurada corretamente.

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

Para executar a amostra

  1. Defina o projeto de sua escolha como o projeto de inicialização da solução.

    1. CodeTestClient mostra como usar a atividade usando código.

    2. DesignerTestClient mostra como usar a atividade dentro do designer.

  2. Compile e execute o projeto.