Udostępnij przez


Wybierz działanie

Działanie Pick upraszcza modelowanie zestawu wyzwalaczy zdarzeń, po których następują odpowiednie procedury obsługi. Działanie Pick zawiera kolekcję PickBranch działań, gdzie każda z nich PickBranch jest parowaniem między działaniem Trigger a działaniem Action . Podczas wykonywania, wyzwalacze dla wszystkich gałęzi działają równolegle. Po zakończeniu działania jednego wyzwalacza zostanie wykonana odpowiednia akcja, a wszystkie inne wyzwalacze zostaną anulowane. Zachowanie działania programu .NET Framework 4.6.1Pick jest podobne do działania programu .NET Framework 3.5 ListenActivity .

Poniższy zrzut ekranu z przykładu SDK Korzystanie z czynności Pick przedstawia czynność Pick z dwoma gałęziami. Jedna gałąź ma wyzwalacz o nazwie Odczyt danych wejściowych, działanie niestandardowe, które odczytuje dane wejściowe z wiersza polecenia. Druga gałąź ma Delay wyzwalacz aktywności. Jeśli działanie Odczyt danych wejściowych odbiera dane przed zakończeniem Delay działania, Delay opóźnienie zostanie anulowane, a powitanie zostanie zapisane w konsoli programu . W przeciwnym razie, jeśli działanie Odczyt danych wejściowych nie odbiera danych w wyznaczonym czasie, zostanie anulowane, a komunikat o błędzie czasu zostanie zapisany w konsoli programu. Jest to typowy wzorzec służący do dodawania limitu czasu do dowolnej akcji.

Wybierz działanie

Najlepsze rozwiązania

W przypadku korzystania z funkcji Pick gałąź wykonywana jest gałęzią, której wyzwalacz kończy się jako pierwszy. Koncepcyjnie wszystkie wyzwalacze działają równolegle, a jeden wyzwalacz może wykonać większość swojej logiki, zanim zostanie anulowany przez zakończenie działania innego wyzwalacza. Mając to na uwadze, ogólną wskazówką do zastosowania w przypadku korzystania z działania Pick jest traktowanie wyzwalacza jako reprezentującego pojedyncze zdarzenie i umieszczenie w nim możliwie najmniejszej logiki. W idealnym przypadku wyzwalacz powinien zawierać wystarczającą logikę, aby odebrać zdarzenie, a całe przetwarzanie tego zdarzenia powinno przejść do działania w gałęzi. Ta metoda minimalizuje nakładanie się na siebie między wykonywaniem wyzwalaczy. Rozważmy na przykład element z dwoma Pick wyzwalaczami, przy czym każdy wyzwalacz zawiera Receive aktywność, po której następuje dodatkowa logika. Jeśli dodatkowa logika wprowadza punkt bezczynności, istnieje możliwość pomyślnego ukończenia obu Receive działań. Jeden wyzwalacz zostanie w pełni ukończony, a drugi zostanie częściowo ukończony. W niektórych scenariuszach akceptowanie komunikatu, a następnie częściowe kończenie przetwarzania jest niedopuszczalne. W związku z tym, gdy używane są wbudowane działania obsługi komunikatów WF, takie jak Receive i SendReply, choć Receive jest często używany w wyzwalaczu, SendReply oraz inna logika powinny być umieszczane zawsze, gdy jest to możliwe, w akcji.

Używanie działania Pick w projektancie

Aby użyć opcji Wybierz w projektancie, znajdź pozycję Wybierz i WybierzBranch w przyborniku. Przeciągnij i upuść Wybierz na kanwę. Domyślnie nowe działanie Pick w projektancie będzie zawierać dwie gałęzie. Aby dodać dodatkowe gałęzie, przeciągnij czynność PickBranch i upuść je obok istniejących gałęzi. Działania można umieszczać na aktywności Pick w obszarze Trigger lub obszarze Action dowolnej gałęzi PickBranch.

Używanie działania pick w kodzie

Działanie Pick jest używane przez wypełnianie kolekcji Branches z działaniami PickBranch. Każda PickBranch z działań ma Trigger właściwość typu Activity. Po zakończeniu wykonywania określonego działania, Action zostanie wykonane.

W poniższym przykładzie kodu pokazano, jak używać Pick aktywności do zastosowania limitu czasu dla aktywności, która odczytuje linię z konsoli.

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>