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.
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>