Freigeben über


Aktivität auswählen

Die Pick Aktivität vereinfacht die Modellierung einer Reihe von Ereignistriggern, gefolgt von den entsprechenden Handlern. Eine Pick Aktivität enthält eine Sammlung von PickBranch Aktivitäten, wobei jedes PickBranch eine Kopplung zwischen einer Trigger Aktivität und einer Action Aktivität ist. Bei der Ausführung werden die Trigger für alle Branches parallel ausgeführt. Wenn ein Trigger abgeschlossen ist, wird die entsprechende Aktion ausgeführt, und alle anderen Trigger werden abgebrochen. Das Verhalten der .NET Framework 4.6.1-AktivitätPick ähnelt der .NET Framework 3.5-Aktivität ListenActivity .

Der folgende Screenshot aus dem SDK-Beispiel "Using the Pick Activity" zeigt eine Pick-Aktivität mit zwei Verzweigungen. Eine Verzweigung verfügt über einen Trigger namens Leseeingabe, eine benutzerdefinierte Aktivität, die Eingaben von der Kommandozeile liest. Die zweite Verzweigung weist einen Aktivitätsauslöser Delay auf. Wenn die Read input-Aktivität Daten empfängt, bevor die Delay-Aktivität beendet ist, wird die Delay-Verzögerung abgebrochen, und eine Mitteilung wird in die Konsole geschrieben. Andernfalls, wenn die Leseeingabeaktivität keine Daten in der zugewiesenen Zeit empfängt, wird sie abgebrochen, und eine Timeoutnachricht wird in die Konsole geschrieben. Dies ist ein gängiges Muster zum Hinzufügen eines Timeouts zu jeder Aktion.

Aktivität auswählen

Bewährte Methoden

Bei Verwendung der Pick-Option ist die ausgeführte Verzweigung diejenige, deren Trigger zuerst abgeschlossen wird. Konzeptionell werden alle Trigger parallel ausgeführt, und ein Trigger hat möglicherweise den Großteil seiner Logik ausgeführt, bevor er durch den Abschluss eines anderen Triggers abgebrochen wird. Um dies zu beachten, besteht eine allgemeine Richtlinie bei der Nutzung der Pick-Aktivität darin, den Trigger als einzelnes Ereignis zu betrachten und möglichst wenig Logik darin zu integrieren. Im Idealfall sollte der Trigger nur so viel Logik enthalten, wie erforderlich ist, um ein Ereignis zu empfangen, und die gesamte Verarbeitung dieses Ereignisses sollte in die Aktion der Verzweigung fließen. Diese Methode minimiert die Überlappung zwischen der Ausführung der Trigger. Betrachten Sie z. B. einen Pick mit zwei Triggern, wobei jeder Trigger eine Receive Aktivität enthält, gefolgt von zusätzlicher Logik. Wenn die zusätzliche Logik einen Leerlaufpunkt einführt, besteht die Möglichkeit, beide Receive Aktivitäten erfolgreich abzuschließen. Ein Trigger wird vollständig abgeschlossen, während ein anderer nur teilweise abgeschlossen wird. In einigen Szenarien ist das Akzeptieren einer Nachricht und das teilweise Abschließen der Verarbeitung inakzeptabel. Wenn daher die integrierten WF-Messagingaktivitäten wie Receive und SendReply verwendet, während Receive häufig im Trigger verwendet wird, sollten das SendReply-Objekt und andere Logik nach Möglichkeit der Aktion hinzugefügt werden.

Verwenden der Pick-Aktivität im Designer

Um die Pick-Aktivität im Designer verwenden zu können, suchen Sie in der Toolbox nach Pick und PickBranch. Ziehen Sie Pick per Drag & Drop auf die Canvas. Standardmäßig enthält eine neue Auswahlaktivität im Designer zwei Verzweigungen. Um zusätzliche Branches hinzuzufügen, ziehen Sie die PickBranch-Aktivität per Drag & Drop neben vorhandene Branches. Aktivitäten können für die Pick-Aktivität entweder im Bereich Trigger oder im Bereich Aktion einer PickBranch abgelegt werden.

Verwenden der Pick-Aktivität im Code

Die Pick Aktivität wird verwendet, indem die Branches Sammlung mit PickBranch Aktivitäten auffüllt wird. Die PickBranch Aktivitäten verfügen jeweils über eine Trigger Eigenschaft vom Typ Activity. Wenn die angegebene Aktivität die Ausführung abgeschlossen hat, wird Action ausgeführt.

Im folgenden Codebeispiel wird veranschaulicht, wie Sie eine Pick Aktivität verwenden, um ein Timeout für eine Aktivität zu implementieren, die eine Zeile aus der Konsole liest.

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>