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
Defina o projeto de sua escolha como o projeto de inicialização de solução.
CodeTestClient mostra como usar a atividade com o uso de código.
DesignerTestClient mostra como usar a atividade no designer.
Compile e execute o projeto.