DynamicActivity 만들기

이 항목은 Windows Workflow Foundation 4에 적용됩니다.

이 샘플에서는 DynamicActivity 활동을 사용하여 런타임에 활동을 만드는 두 가지 방법을 보여 줍니다.

이 샘플에서는 ForEachAssign 활동이 포함된 Sequence 활동이 들어 있는 본문을 사용하여 런타임에 활동을 만듭니다. 여기에서는 정수의 입력 목록이 활동에 전달되고 속성으로 설정됩니다. 그런 다음 ForEach 활동에서 값의 목록을 반복하며 누적 계산합니다. Assign 활동에서는 목록의 요소 수로 누적기를 나눠 평균 값을 계산하고 그 결과를 평균에 할당합니다.

이 샘플에서는 변수를 입력 인수로 이동하고 값을 출력 인수로 반환하는 DynamicActivity 활동의 사용 방법을 보여 줍니다. 이 활동에는 정수 목록인 Numbers라는 입력 인수 한 개가 있습니다. ForEach 활동에서 값의 목록을 반복하며 누적 계산합니다. Assign 활동에서는 목록의 요소 수로 누적기를 나눠 평균 값을 계산하고 그 결과를 평균에 할당합니다. 평균은 Average라는 출력 인수로 반환됩니다.

프로그래밍 방식으로 동적 활동을 만드는 경우 입력과 출력이 다음 코드 예제에서와 같이 선언됩니다.

DynamicActivity act = new DynamicActivity()
{
    DisplayName = "Find average",
    Properties = 
    {
        // Input argument
        new DynamicActivityProperty
        {
            Name = "Numbers",
            Type = typeof(InArgument<List<int>>),
            Value = numbers
        },
        // Output argument
        new DynamicActivityProperty
        {
            Name = "Average",
            Type = typeof(OutArgument<double>),
            Value = average
        }
    },
};

다음 코드 예제에서는 목록의 값에 대한 평균을 계산하는 DynamicActivity의 완벽한 정의를 보여 줍니다.

DynamicActivity act = new DynamicActivity()
{
    DisplayName = "Find average",
    Properties = 
    {
        // Input argument
        new DynamicActivityProperty
        {
            Name = "Numbers",
            Type = typeof(InArgument<List<int>>),
            Value = numbers
        },
        // Output argument
        new DynamicActivityProperty
        {
            Name = "Average",
            Type = typeof(OutArgument<double>),
            Value = average
        }
    },
    Implementation = () =>
        new Sequence
        {
            Variables = { result, accumulator },
            Activities =
            {
                new ForEach<int>
                {
                    Values =  new ArgumentValue<IEnumerable<int>> { ArgumentName = "Numbers" },                                
                    Body = new ActivityAction<int>
                    {
                        Argument = iterationVariable,
                        Handler = new Assign<int>
                        {
                            To = accumulator,
                            Value = new InArgument<int>(env => iterationVariable.Get(env) +  accumulator.Get(env))
                        }
                    }
                },

                // Calculate the average and assign to the output argument.
                new Assign<double>
                {
                    To = new ArgumentReference<double> { ArgumentName = "Average" },
                    Value = new InArgument<double>(env => accumulator.Get(env) / numbers.Get(env).Count<int>())
                },
            }
        }
};

XAML에서 이를 만드는 경우 입력과 출력이 다음 예제에서와 같이 선언됩니다.

<Activity x:Class="Microsoft.Samples.DynamicActivityCreation.FindAverage"
          xmlns="https://schemas.microsoft.com/netfx/2009/xaml/activities"
          xmlns:scg="clr-namespace:System.Collections.Generic;assembly=mscorlib"
          xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml">
  <x:Members>
    <x:Property Name="Numbers" Type="InArgument(scg:List(x:Int32))" />
    <x:Property Name="Average" Type="OutArgument(x:Double)" />
  </x:Members>
    ...
    ...
</Activity>

Windows Workflow Designer에서 XAML을 시각적으로 만들 수 있습니다. Visual Studio 프로젝트에 이를 포함하는 경우 컴파일 방지를 위해 "빌드 동작"을 "없음"으로 설정해야 합니다. 그런 다음 아래와 같은 호출을 사용하여 동적으로 XAML을 로드할 수 있습니다.

Activity act2 = ActivityXamlServices.Load(@"FindAverage.xaml");

프로그래밍 방식으로 만들거나 XAML 워크플로를 로드하여 만든 DynamicActivity 인스턴스를 다음 코드 예제에서와 같이 사용할 수 있습니다. WorkflowInvoker.Invoke에 전달되는 "act"는 첫째 코드 예제에 정의된 "act" Activity라는 점에 주목할 필요가 있습니다.

IDictionary<string, object> results = WorkflowInvoker.Invoke(act, new Dictionary<string, object> { { "Numbers", numbers } });

Console.WriteLine("The average calculated using the code activity is = " + results["Average"]);

이 샘플을 사용하려면

  1. Visual Studio 2010에서 DynamicActivityCreation.sln 솔루션 파일을 엽니다.

  2. F6 키를 눌러 솔루션을 빌드합니다.

  3. Ctrl+F5를 눌러 솔루션을 실행합니다.

명령줄 인수

이 샘플에는 명령줄 인수를 사용할 수 있습니다. 활동에서 평균을 계산하는 데 필요한 숫자 목록을 사용자가 입력할 수 있습니다. 사용할 숫자의 목록을 입력할 때는 목록의 각 숫자를 공백으로 구분해야 합니다. 예를 들어 5, 10, 32의 평균을 계산하려면 다음과 같은 명령줄을 사용하여 샘플을 호출합니다.

DynamicActivityCreation 5 10 32
Dd807392.Important(ko-kr,VS.100).gif 참고:
컴퓨터에 이 샘플이 이미 설치되어 있을 수도 있습니다. 계속하기 전에 다음(기본) 디렉터리를 확인하십시오.

<InstallDrive>:\WF_WCF_Samples

이 디렉터리가 없으면 Windows Communication Foundation (WCF) and Windows Workflow Foundation (WF) Samples for .NET Framework 4로 이동하여 WCF(Windows Communication Foundation) 및 WF 샘플을 모두 다운로드하십시오. 이 샘플은 다음 디렉터리에 있습니다.

<InstallDrive>:\WF_WCF_Samples\WF\Basic\Built-InActivities\DynamicActivity\DynamicActivityCreation