Partilhar via


ParallelForEach não genérico

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

ParallelForEach<T> requer que sua Values propriedade seja do tipo IEnumerable<T>. Isso impede que os usuários iterem sobre estruturas de dados que implementam IEnumerable<T> interface (por exemplo, ArrayList). A versão não genérica do ParallelForEach<T> supera esse requisito, em detrimento de mais complexidade em tempo de execução 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 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 é iterada e o corpo é executado para cada valor na lista.

ParallelForEach<T> tem um CompletionCondition, para que a ParallelForEach<T> atividade possa ser concluída mais cedo se a avaliação dos CompletionCondition retornos 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 iterar através 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)
O ActivityAction do tipo Object, que é executado para cada elemento da coleção. Cada elemento individual é passado para o Corpo através de sua propriedade Argumento.

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

CompletionCondition (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 ParallelForEach

O designer de atividade para o exemplo é semelhante em aparência ao designer fornecido para a atividade interna ParallelForEach<T> . O designer aparece na caixa de ferramentas na categoria Exemplos, Atividades não genéricas. O designer é chamado ParallelForEachWithBodyFactory na caixa de ferramentas, porque a atividade expõe um IActivityTemplateFactory na caixa de ferramentas que cria a atividade com um ActivityAction.

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.