다음을 통해 공유


선택 활동

Pick 활동은 해당 처리기 앞에 있는 이벤트 트리거 집합의 모델링을 단순화합니다. Pick 활동은 PickBranch 활동 컬렉션을 포함합니다. 여기서 각 PickBranchTrigger 활동과 Action 활동의 쌍입니다. 실행 시간에 모든 분기에 대한 트리거가 병렬로 실행됩니다. 트리거 하나가 완료되면 그에 상응하는 작업이 실행되고 다른 모든 트리거가 취소됩니다. .NET Framework 4.6.1Pick 작업의 동작은 .NET Framework 3.5 ListenActivity 작업과 유사합니다.

다음 Pick 활동 사용 SDK 샘플 스크린샷에서는 분기가 두 개 있는 Pick 활동을 보여 줍니다. 한 분기에는 명령줄에서 입력을 읽는 사용자 지정 활동인 Read input이라는 트리거가 있습니다. 두 번째 분기에는 Delay 활동 트리거가 있습니다. Delay 활동이 완료되기 전에 Read input 활동에 데이터가 수신되면 Delay 지연이 취소되고 인사말이 콘솔에 기록됩니다. 할당된 시간 안에 Read input 활동에 데이터가 수신되지 않으면 활동이 취소되고 시간 제한 메시지가 콘솔에 기록됩니다. 이것은 모든 작업에 제한 시간을 추가하는 데 사용되는 일반적인 패턴입니다.

Pick Activity

모범 사례

Pick을 사용할 때 실행되는 분기는 트리거가 먼저 완료되는 분기입니다. 개념상 모든 트리거는 병렬로 실행되며 다른 트리거가 완료되어 해당 트리거가 취소되기 전에 한 트리거가 대부분의 논리를 실행할 수 있습니다. 이 점을 염두에 두고 Pick 활동을 사용할 때 따라야 할 일반적인 지침은 트리거를 단일 이벤트를 나타내는 것으로 처리하고 가능한 한 작은 논리를 입력하는 것입니다. 이상적으로는 트리거가 이벤트를 받을 만큼 충분한 논리를 포함해야 하며 해당 이벤트의 모든 처리가 분기 작업으로 이동해야 합니다. 이 메서드는 트리거 실행 간에 겹치는 양을 최소화합니다. 예를 들어, 트리거 두 개를 사용하는 Pick을 살펴봅니다. 이 경우 각 트리거는 Receive 활동과 추가 논리를 포함합니다. 추가 논리로 유휴 지점이 도입되는 경우 두 Receive 활동이 성공적으로 완료될 가능성이 있습니다. 한 트리거는 완전히 완료되는 반면, 다른 트리거는 부분적으로 완료됩니다. 일부 시나리오에서는 메시지를 허용한 다음 메시지 처리를 부분적으로 완료하는 방법이 허용되지 않습니다. 따라서 Receive가 트리거에서 일반적으로 사용되는 동안 SendReplyReceive와 같은 WF 기본 제공 메시징 활동을 사용할 때는 가능한 경우 항상 SendReply 및 기타 논리를 작업에 입력해야 합니다.

디자이너에서 Pick 활동 사용

디자이너에서 Pick을 사용하려면 도구 상자에서 PickPickBranch를 찾습니다. Pick를 끌어 캔버스에 놓습니다. 기본적으로 디자이너의 새 Pick 활동은 분기 두 개를 포함합니다. 분기를 더 추가하려면 PickBranch 활동을 끌어서 기존 분기 옆에 놓습니다. Pick 활동의 Trigger 영역 또는 PickBranchAction 영역에 활동을 놓을 수 있습니다.

코드에서 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>