Escolher atividade
A atividade de Pick simplifica a modelagem de um conjunto de disparadores de evento seguidos por seus manipuladores correspondentes. Uma atividade de Pick contém uma coleção de atividades de PickBranch , onde cada PickBranch é um emparelhamento entre uma atividade de Trigger e uma atividade de Action . Em tempo de execução, disparadores para todos as ramificações são executados paralelamente. Quando um disparador for concluída, então a ação correspondente é executada, e todos outros disparadores são canceladas. O comportamento da atividade .NET Framework 4.6.1Pick é semelhante à atividade .NET Framework 3.5ListenActivity.
A captura de tela do exemplo do SDK a seguir de Como usar uma atividade de escolha mostra uma atividade de Seleção de duas ramificações. Uma ramificação tem um disparador chamado Entrada de leitura, uma atividade personalizado que lê a entrada de linha de comando. O segundo ramificação tem um disparador de atividade de Delay . Se a atividade de Entrada de leitura recebe dados antes da atividade de Delay terminar, o atraso de Delay será cancelado e uma saudação será escrito no console. Caso contrário, se a atividade de Entrada de leitura não receber dados em tempo distribuídos, então ele será cancelado e uma mensagem de tempo limite será escrita para o console. Este é um padrão comum usado para adicionar um tempo limite a qualquer ação.
Práticas recomendadas
Ao usar a picareta, a ramificação que executa é a ramificação cujo disparador for concluído primeiro. Conceitualmente, todos os disparadores executam paralelamente, e um disparador pode ter executado a maioria de sua lógica antes de ser cancelado pela conclusão de um outro disparador. Com isso em mente, uma orientação então quando usar a atividade de picareta é manipular o disparador como representação de um único evento, e a colocar como pouca lógica como possível nele. Idealmente, o disparador deve conter apenas lógica suficiente para receber um evento, e qualquer processamento do evento deve entrar em ação de ramificação. Este método minimiza a quantidade de sobreposição entre a execução de disparadores. Por exemplo, considere Pick com dois disparadores, onde cada disparador contém uma atividade de Receive seguido pela lógica adicional. Se a lógica adicional apresenta um ponto ocioso, então existem a possibilidade de ambas as atividades de Receive que concluírem com êxito. Um disparador concluirá totalmente, quando outro concluirá parcialmente. Em alguns cenários, aceitar uma mensagem, e então concluir parcialmente o processamento delas são inaceitáveis. Portanto, ao usar atividades internos de mensagem de WF como Receive e SendReply, quando Receive são comumente usadas no disparador, SendReply e a outra lógica deve ser colocado em ação sempre que possível.
Usando a atividade de picareta no designer
Para usar a Escolha no designer, localize Escolher e PickBranch na caixa de ferramentas. Arrastar e soltar Escolher na tela. Por padrão, uma nova atividade de Escolher no designer irá conter duas ramificações. Para adicionar ramificações adicionais, arraste a atividade de PickBranch e solte-a ao lado de ramificações existentes. As atividades podem ser soltas na atividade Escolher na área de Disparador ou na área de Ação de qualquer PickBranch.
Usando a atividade de picareta no código
A atividade de Pick é usada preenchendo sua coleção de Branches com atividades de PickBranch . As atividades cada um de PickBranch possuem uma propriedade de Trigger de tipo Activity. Quando a atividade especificada concluir a execução, Action executa.
O exemplo de código demonstra como usar uma atividade de Pick para implementar um tempo limite para uma atividade que lê uma linha de console.
Sequence body = new Sequence()
{
Variables = { name },
Activities =
{
new System.Activities.Statements.Pick
{
Branches =
{
new PickBranch
{
Trigger = new ReadLine
{
Result = name,
BookmarkName = "name"
},
Action = new WriteLine
{
Text = ExpressionServices.Convert<string>(ctx => "Hello " +
name.Get(ctx))
}
},
new PickBranch
{
Trigger = new Delay
{
Duration = new TimeSpan(0, 0, 5)
},
Action = new WriteLine
{
Text = "Time is up."
}
}
}
}
}
};
<Sequence xmlns="http://schemas.microsoft.com/netfx/2009/xaml/activities" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
<Sequence.Variables>
<Variable x:TypeArguments="x:String" Name="username" />
</Sequence.Variables>
<Pick>
<PickBranch>
<PickBranch.Trigger>
<ReadLine BookmarkName="name" Result="username" />
</PickBranch.Trigger>
<WriteLine>[String.Concat("Hello ", username)]</WriteLine>
</PickBranch>
<PickBranch>
<PickBranch.Trigger>
<Delay>00:00:05</Delay>
</PickBranch.Trigger>
<WriteLine>Time is up.</WriteLine>
</PickBranch>
</Pick>
</Sequence>