Создание действия DynamicActivity

Данный раздел относится к версии Windows Workflow Foundation 4.

В этом образце показываются два разных способа создания действия во время выполнения с помощью действия DynamicActivity.

В этом образце во время выполнения создается действие с текстом, содержащим действие Sequence, которое содержит действия ForEach и Assign. Входной список целых чисел передается действию и задается в виде свойства. Затем действие 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>

XAML можно создать визуально с помощью Конструктор рабочих процессов Windows. Если он включается в проект Visual Studio, то его параметру «Действие сборки» следует задать значение «Нет», чтобы не допустить его компиляции. Затем XAML можно загружать динамически с помощью следующего вызова.

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

Экземпляр DynamicActivity, созданный программным образом или методом загрузки рабочего процесса XAML, можно использовать так, как это показано в следующем примере кода. Следует заметить, что команда «act», передаваемая WorkflowInvoker.Invoke, — это команда «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. Откройте файл решения DynamicActivityCreation.sln в среде Visual Studio 2010.

  2. Чтобы построить решение, нажмите клавишу F6.

  3. Чтобы запустить решение, нажмите клавиши CTRL+F5.

Аргументы командной строки

Этот образец принимает аргументы командной строки. Пользователи могут предоставить действию список чисел для вычисления их среднего значения. Используемый список чисел передается как список чисел, разделенных пробелами. Например, чтобы вычислить среднее значение чисел 5, 10 и 32, образец следует вызвать с использованием следующей командной строки.

DynamicActivityCreation 5 10 32
Dd807392.Important(ru-ru,VS.100).gif Примечание
Образцы уже могут быть установлены на компьютере. Перед продолжением проверьте следующий каталог (по умолчанию).

<диск_установки>:\WF_WCF_Samples

Если этот каталог не существует, перейдите на страницу Образцы Windows Communication Foundation (WCF) и Windows Workflow Foundation (WF) для .NET Framework 4, чтобы загрузить все образцы Windows Communication Foundation (WCF) и WF. Этот образец расположен в следующем каталоге.

<диск_установки>:\WF_WCF_Samples\WF\Basic\Built-InActivities\DynamicActivity\DynamicActivityCreation