Partilhar via


ParallelForEach não genérico

O .NET Framework 4.6.1 inclui na sua caixa de ferramentas um conjunto de atividades de Fluxo de Controle, incluindo ParallelForEach<T>, que permite iterar por coleções.

ParallelForEach<T> requer que sua Values propriedade seja do tipo IEnumerable<T>. Isto impossibilita que os utilizadores iterem sobre estruturas de dados que implementam a interface IEnumerable<T> (por exemplo, ArrayList). A versão não genérica de ParallelForEach<T> supera este requisito, à custa de uma maior complexidade em tempo de execução para garantir a compatibilidade dos tipos de 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 iterar através do ArrayList.

Atividade ParallelForEach

A instrução C#/Visual Basic foreach enumera os elementos de uma coleção, executando uma instrução incorporada para cada elemento da coleção. As atividades equivalentes do WF são ForEach<T> e ParallelForEach<T>. A ForEach<T> atividade contém uma lista de valores e um corpo. Em tempo de execução, a lista é percorrida e o bloco de código é executado para cada valor da lista.

ParallelForEach<T> tem um CompletionCondition, para que a atividade de ParallelForEach<T> possa ser concluída mais cedo se a avaliação de CompletionCondition retornar true. O CompletionCondition é 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 preferida, porque abrange a maioria dos cenários em que é usada e fornece verificação de tipo em tempo de compilação. A versão não genérica pode ser usada para percorrer 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)
O ActivityAction do tipo Object, que é executado sobre cada elemento da coleção. Cada elemento individual é passado para o Corpo através da propriedade Argumento.

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

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 essa propriedade não estiver definida, todas as atividades na coleção Branches serão executadas até a conclusão.

Exemplo de uso de 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 criador de atividades para o exemplo é similar na aparência ao criador fornecido para a atividade embutida ParallelForEach<T>. O designer aparece na caixa de ferramentas na categoria Exemplos, Atividades não genéricas . O designer é chamado ParallelForEachWithBodyFactory nas ferramentas, porque a atividade expõe uma IActivityTemplateFactory nas ferramentas que cria a atividade com um ActivityAction devidamente configurado.

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 o exemplo

  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. Crie e execute o projeto.