Pick アクティビティ

Pick アクティビティを使用すると、イベント トリガー セットとそれに続く対応するハンドラーのモデル化が単純になります。 Pick アクティビティには、PickBranch アクティビティのコレクションが含まれます。各 PickBranchTrigger アクティビティと Action アクティビティの組み合わせです。 実行時に、すべての分岐のトリガーが並行して実行されます。 1 つのトリガーが完了すると、対応するアクションが実行され、その他すべてのトリガーが取り消されます。 .NET Framework 4.6.1 の Pick アクティビティの動作は .NET Framework 3.5 の ListenActivity アクティビティに似ています。

次の「Pick アクティビティの使用」に含まれる SDK サンプルのスクリーンショットは、2 つの分岐がある Pick アクティビティを示しています。 1 つ目の分岐には Read input というトリガーがあります。これはコマンド ラインから入力を読み取るカスタム アクティビティです。 2 つ目の分岐には Delay アクティビティ トリガーがあります。 Delay アクティビティが完了する前に Read input アクティビティがデータを受信した場合、Delay Delay が取り消され、メッセージがコンソールに書き込まれます。 それ以外の場合、Read input が割り当て時間内にデータを受信しないときは、アクティビティは取り消され、タイムアウト メッセージがコンソールに書き込まれます。 これは、任意のアクションにタイムアウトを追加するために使用される一般的なパターンです。

Pick アクティビティ

ベスト プラクティス

Pick を使用する場合、実行する分岐は、トリガーが最初に完了する分岐です。 概念的には、すべてのトリガーは並行して実行され、1 つのトリガーがロジックの大部分を実行してから、他のトリガーが完了したために実行が取り消されることがあります。 この点に留意すると、Pick アクティビティを使用する場合に従う一般的なガイドラインは、トリガーを単一のイベントの代表として扱い、できるだけ少ないロジックを含めることです。 理想的には、トリガーにはイベントを受信するために必要なロジックのみを含め、そのイベントのすべての処理を分岐のアクションに含めます。 この方法で、トリガーの実行の重複を最小限に抑えることができます。 たとえば、2 つのトリガーを含む Pick があるとします。各トリガーには Receive アクティビティとそれに続いて追加のロジックが含まれます。 追加のロジックによってアイドル ポイントが発生する場合、両方の Receive は正常に完了する可能性があります。 1 つのトリガーが完全に完了し、もう 1 つのトリガーは部分的に完了します。 一部のシナリオでは、メッセージを受け入れてから、その処理を部分的に完了することは許容されません。 したがって、ReceiveSendReply など、WF のビルトイン メッセージング アクティビティを使用する場合、一般的には Receive がトリガーに使用されますが、可能な限り SendReply や他のロジックをアクションに含める必要があります。

デザイナーでの Pick アクティビティの使用

デザイナーで Pick を使用するには、ツールボックスで [Pick][PickBranch] を見つけます。 [Pick] をキャンバスにドラッグ アンド ドロップします。 既定では、デザイナーに新しく追加された Pick アクティビティには 2 つの分岐があります。 新しい分岐を追加するには、PickBranch アクティビティを既存の分岐の横にドラッグ アンド ドロップします。 アクティビティは、任意の PickBranch[Trigger] 領域または [Action] 領域の Pick アクティビティにドロップできます。

コードでの Pick アクティビティの使用

Pick アクティビティを使用するには、Branches アクティビティで PickBranch コレクションを設定します。 PickBranch アクティビティには、それぞれ Trigger 型の Activity プロパティがあります。 指定したアクティビティの実行が完了すると、Action が実行されます。

次のコードは、Pick アクティビティを使用して、コンソールからの入力を読み取るアクティビティのタイムアウトを実装する方法の例です。

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>