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>
可使用 Windows 工作流设计器 以可视化方式创建 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"]);
使用此示例
使用 Visual Studio 2010 打开 DynamicActivityCreation.sln 解决方案文件。
若要生成解决方案,请按 F6。
若要运行解决方案,请按 Ctrl+F5。
命令行参数
此示例接受命令行参数。用户可以为活动提供一个数字列表来计算其平均值。要使用的数字列表以由空格分隔的数字列表的形式进行传递。例如,若要计算 5、10 和 32 的平均值,请使用下面的命令行调用此示例。
DynamicActivityCreation 5 10 32
注意: |
---|
您的计算机上可能已安装这些示例。在继续操作之前,请先检查以下(默认)目录:
<安装驱动器>:\WF_WCF_Samples
如果此目录不存在,请转到 .NET Framework 4 的 Windows Communication Foundation (WCF) 和 Windows Workflow Foundation (WF) 示例(可能为英文网页),下载所有 Windows Communication Foundation (WCF) 和 WF 示例。此示例位于以下目录:
<安装驱动器>:\WF_WCF_Samples\WF\Basic\Built-InActivities\DynamicActivity\DynamicActivityCreation
|