Compartilhar via


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.

Pick Activity

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>