Udostępnij za pośrednictwem


Wybieranie działania

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 . W czasie wykonywania wyzwalacze dla wszystkich gałęzi są wykonywane 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 Using the Pick Activity SDK (Korzystanie z zestawu SDK pick activity SDK) przedstawia działanie 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 działania. 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 anulowany, a komunikat o przekroczeniu limitu czasu zostanie zapisany w konsoli programu . Jest to typowy wzorzec służący do dodawania limitu czasu do dowolnej akcji.

Pick Activity

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 są wykonywane równolegle, a jeden wyzwalacz mógł wykonać większość logiki, zanim zostanie anulowany przez ukończenie 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 wszystkie przetwarzanie tego zdarzenia powinno przejść do akcji gałęzi. Ta metoda minimalizuje nakładanie się na siebie między wykonywaniem wyzwalaczy. Rozważmy na przykład element z dwoma Pick wyzwalaczami, gdzie każdy wyzwalacz zawiera Receive działanie, po którym 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 w przypadku korzystania z wbudowanych działań obsługi komunikatów WF, takich jak Receive i SendReply, podczas gdy Receive jest on często używany w wyzwalaczu, SendReply a inna logika powinna być umieszczana w akcji zawsze, gdy jest to możliwe.

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ść pozycję Wybierz na kanwę. Domyślnie nowe działanie wyboru w projektancie będzie zawierać dwie gałęzie. Aby dodać dodatkowe gałęzie, przeciągnij działanie PickBranch i upuść je obok istniejących gałęzi. Działania można zrzucić na działanie wyboru do obszaru Wyzwalacz lub obszaru Akcja dowolnego elementu PickBranch.

Używanie działania pick w kodzie

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

W poniższym przykładzie kodu pokazano, jak używać Pick działania do implementowania limitu czasu dla działania, które odczytuje wiersz z konsoli programu .

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>