Tevékenység kiválasztása

A Pick tevékenység leegyszerűsíti az eseményindítók egy készletének modellezését, amelyet a hozzájuk tartozó kezelők követnek. A Pick tevékenység egy PickBranch tevékenységek gyűjteményét tartalmazza, ahol mindegyik PickBranch egy Trigger tevékenység és egy Action tevékenység közötti párosítás. A végrehajtáskor a rendszer az összes ág eseményindítóit párhuzamosan hajtja végre. Amikor egy eseményindító befejeződik, a rendszer végrehajtja a megfelelő műveletet, és az összes többi eseményindítót megszakítja. A .NET Framework 4.6.1-tevékenységPick viselkedése hasonló a .NET-keretrendszer 3.5-ös ListenActivity tevékenységéhez.

Az alábbi képernyőkép a Pick Activity SDK mintából egy Pick tevékenységet mutat, amelynek két ága van. Az egyik ághoz tartozik egy Olvasási bemenet nevű eseményindító, egy egyéni tevékenység, amely beolvassa a bemenetet a parancssorból. A második ág tevékenységindítóval Delay rendelkezik. Ha az adatolvasás tevékenység adatokat fogad, mielőtt a Delay aktivitás befejeződik, a Delay késleltetés megszakad, és a rendszer egy üdvözlőszöveget fog írni a konzolra. Ellenkező esetben, ha az olvasási beviteli tevékenység nem fogad adatokat a megadott időpontban, akkor az megszakad, és a rendszer időtúllépési üzenetet ír a konzolra. Ez egy gyakori sablon, amellyel időtúllépést adhat hozzá minden művelethez.

Tevékenység kiválasztása

Ajánlott eljárások

A Pick használatakor az a végrehajtó ág működik, amelynek kiváltó oka először teljesül. Elméletileg az összes eseményindító párhuzamosan fut, és előfordulhat, hogy az egyik eseményindító végrehajtotta a logikájának többségét, mielőtt egy másik eseményindító befejeződése megszakította volna. Ezt szem előtt tartva a Pick tevékenység használatakor követendő általános útmutató az, hogy az eseményindítót egyetlen eseményként kezeli, és a lehető legkevesebb logikát helyezi bele. Ideális esetben az eseményindítónak elegendő logikát kell tartalmaznia az esemény fogadásához, és az esemény feldolgozásának az ág műveletébe kell mennie. Ezzel a módszerrel minimálisra csökkenthető az átfedés az eseményindítók végrehajtása között. Vegyük például a Pick két eseményindítót, ahol minden eseményindító tartalmaz egy Receive tevékenységet, amelyet további logika követ. Ha a további logika üresjárati pontot vezet be, akkor lehetséges, hogy mindkét Receive tevékenység sikeresen befejeződik. Az egyik eseményindító teljesen befejeződik, míg a másik részben befejeződik. Bizonyos esetekben az üzenet elfogadása, majd a feldolgozás részleges befejezése elfogadhatatlan. Ezért, amikor WF beépített üzenetkezelési tevékenységeket használ, például Receive és SendReply, bár a Receive gyakran az eseményindítóban van használva, a SendReply és más logikát mindig, amikor csak lehetséges, a műveletben kell elhelyezni.

A Pick tevékenység használata a tervezőben

A Pick tervezőben való használatához keresse meg a Pick és a PickBranch elemet az eszközkészletben. Húzza a Pick billentyűt a vászonra. Alapértelmezés szerint a tervezőben egy új pick activity két ágat fog tartalmazni. További ágak hozzáadásához húzza a PickBranch tevékenységet a meglévő ágak mellé. A tevékenységek a Pick Tevékenység Trigger területére vagy bármely PickBranchAction területére helyezhetők.

Kódban történő Pick Activity használat

A Pick tevékenység úgy használható, hogy a Branches gyűjteményt megtöltik PickBranch tevékenységekkel. Az PickBranch tevékenységek mindegyikének van egy Trigger típusú Activity tulajdonsága. Amikor a megadott tevékenység befejezi a végrehajtást, a Action végrehajtódik.

Az alábbi példakód bemutatja, hogyan lehet egy Pick tevékenységet használni időtúllépés implementálásához olyan tevékenységben, amely egy sort olvas be a konzolról.

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>