Compartir a través de


Seleccionar actividad

La Pick actividad simplifica el modelado de un conjunto de desencadenadores de eventos seguidos de sus controladores correspondientes. Una Pick actividad contiene una colección de PickBranch actividades, donde cada una PickBranch es un emparejamiento entre una Trigger actividad y una Action actividad. En tiempo de ejecución, los desencadenadores de todas las ramas se ejecutan en paralelo. Cuando se completa un desencadenador, se ejecuta su acción correspondiente y se cancelan todos los demás desencadenadores. El comportamiento de la actividad .NET Framework 4.6.1Pick es similar a la actividad de .NET Framework 3.5 ListenActivity .

La siguiente captura de pantalla del ejemplo de SDK Uso de la actividad Pick muestra una actividad Pick con dos bifurcaciones. Una rama tiene un desencadenador denominado Leer entrada, una actividad personalizada que lee la entrada desde la línea de comandos. La segunda bifurcación tiene un desencadenador de actividad Delay. Si la actividad Read input recibe los datos antes de que la actividad Delay finalice, se cancelará el retraso de Delay y se escribirá un saludo en la consola. De lo contrario, si la actividad Leer entrada no recibe datos en el tiempo asignado, se cancelará y se escribirá un mensaje de error por tiempo de espera en la consola. Se trata de un patrón común que se usa para agregar un tiempo de espera a cualquier acción.

Seleccionar actividad

procedimientos recomendados

Al usar Pick, la bifurcación que se ejecuta es la bifurcación cuyo desencadenador se completa primero. Conceptualmente, todos los desencadenadores se ejecutan en paralelo y un desencadenador puede haber ejecutado la mayoría de su lógica antes de que se cancele mediante la finalización de otro desencadenador. Con esta perspectiva, una instrucción general que seguir cuando se usa la actividad Pick es tratar el desencadenador como si representara un único evento y poner tan poca lógica como sea posible en él. Lo ideal es que el desencadenador contenga la cantidad adecuada de lógica para recibir un evento, y todo el procesamiento de ese evento debería realizarse en la acción de la rama. Este método minimiza la cantidad de superposición entre la ejecución de los desencadenadores. Por ejemplo, considere un Pick con dos desencadenadores, en los que cada uno contiene una actividad de Receive seguida de lógica adicional. Si la lógica adicional introduce un punto inactivo, existe la posibilidad de que ambas Receive actividades se completen correctamente. Un desencadenador se completará totalmente, mientras que otro se completará parcialmente. En algunos escenarios, aceptar un mensaje y, después, completar parcialmente el procesamiento de él es inaceptable. Por lo tanto, al usar actividades de mensajería integradas de WF como Receive y SendReply, aunque Receive se utilice habitualmente en el desencadenador, se debe colocar SendReply y otras lógicas en la acción siempre que sea posible.

Usar la actividad Pick en el diseñador

Para usar Pick en el diseñador, busque Pick y PickBranch en el cuadro de herramientas. Arrastre y coloque Pick en el lienzo. De forma predeterminada, una nueva actividad pick en el diseñador contendrá dos ramas. Para agregar ramas adicionales, arrastre la actividad PickBranch y colóquela junto a las ramas existentes. Las actividades se pueden colocar en la actividad Pick en el área Trigger o el área Action de cualquier PickBranch.

Usar la actividad Pick en el código

La actividad Pick se usa rellenando la colección de Branches con actividades PickBranch. Las PickBranch actividades tienen cada una una propiedad Trigger de tipo Activity. Cuando la actividad especificada finaliza la ejecución, Action se ejecuta.

En el ejemplo de código siguiente se muestra cómo usar una Pick actividad para implementar un tiempo de espera para una actividad que lee una línea de la consola.

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>