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, inclusive ParallelForEach<T>, que permite iterar através das coleções de IEnumerable<T>.

ParallelForEach<T> requer sua propriedade de Values ser 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érico de ParallelForEach<T> supera esse requisito, custas de mais complexidade de tempo de execução para garantir a compatibilidade dos tipos de valores na coleção.

O exemplo de 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 foreach do C#/Visual Basic enumera os elementos de uma coleção, executando uma instrução incorporada para cada elemento da coleção. As atividades equivalentes de WF são ForEach<T> e ParallelForEach<T>. A atividade de ForEach<T> contém uma lista de valores e um corpo. Em tempo de execução, 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. CompletionCondition é avaliado após cada iteração é concluída.

Para a maioria dos casos, a versão genérica de atividade deve ser a solução preferencial, porque ele aborda a maioria das situações em que é usada e fornece verificação de tipo em tempo de compilação. A versão não genérico pode ser usada iterando por tipos que implementam a interface não genérica de IEnumerable .

Definição de classe

O exemplo de código a seguir mostra a definição de uma atividade não genérico de 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 corpo através da propriedade do argumento.

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

CompletionCondition (opcional)
A propriedade de CompletionCondition é avaliada após qualquer iteração completa. Se for avaliada como true, então o agendada durante iterações é cancelado. Se esta propriedade não for definida, todas as atividades na coleção de ramificações executam até a conclusão.

Exemplo de uso de ParallelForEach

O código a seguir demonstra como usar a atividade de 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 Amostras, 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 de solução.

    1. CodeTestClient mostra como usar a atividade com o uso de código.

    2. DesignerTestClient mostra como usar a atividade no designer.

  2. Compile e execute o projeto.