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
Defina o projeto de sua escolha como o projeto de inicialização da solução.
CodeTestClient mostra como usar a atividade usando código.
DesignerTestClient mostra como usar a atividade dentro do designer.
Crie e execute o projeto.