非泛型 ParallelForEach
本主题适用于 Windows Workflow Foundation 4。
.NET Framework 版本 4 的工具箱中附带了一组控制流活动,其中包括可用来循环访问 IEnumerable 集合的 ParallelForEach。
ParallelForEach 要求其 Values 属性为 IEnumerable 类型。这将阻止用户循环访问实现 IEnumerable 接口(例如,ArrayList)的数据结构。非泛型版本的 ParallelForEach 没有这一要求,不过与此对应的代价是,需要更复杂的运行时来确保集合中的值类型的兼容性。
此示例演示如何实现非泛型的 ParallelForEach 活动及其设计器。此活动可用于循环访问 ArrayList。
ParallelForEach 活动
C#/VB foreach 语句枚举集合的元素,对集合中的每个元素执行嵌入语句。WF 等效活动为 ForEach 和 ParallelForEach。ForEach 活动包含一个值列表和一个主体。在运行时,将循环访问此列表,并对列表中的每个值执行主体。
ParallelForEach 具有一个 CompletionCondition,以便在 CompletionCondition 的计算返回 true 的情况下,ParallelForEach 活动能够及早完成。在每次迭代完成之后,将计算 CompletionCondition。
对于大多数情况,此活动的泛型版本应为首选解决方案,因为它涵盖了应使用此活动的大多数方案,并且提供编译时类型检查。非泛型版本可用于循环访问实现非泛型 IEnumerable 接口的类型。
类定义
下面的代码示例显示非泛型 ParallelForEach 活动的定义。
[ContentProperty("Body")]
public class ParallelForEach : NativeActivity
{
[RequiredArgument]
[DefaultValue(null)]
InArgument<IEnumerable> Values { get; set; }
[DefaultValue(null)]
[DependsOn("Values")]
public Activity<bool> CompletionCondition
[DefaultValue(null)]
[DependsOn("CompletionCondition")]
ActivityAction<object> Body { get; set; }
}
- Body(可选)
Object 类型的 ActivityAction,将对集合中的每个元素执行它。通过单个元素的 Argument 属性将其传递到 Body。
- Values(可选)
循环访问的元素集合。在运行时确保所有集合元素为兼容类型。
- CompletionCondition(可选)
在任何迭代完成之后,将计算 CompletionCondition 属性。如果其计算结果为 true,则取消已安排的挂起的迭代。如果未设置此属性,则 Branches 集合中的所有活动都将执行,直至完成为止。
使用 ParallelForEach 的示例
下面的代码演示如何在应用程序中使用 ParallelForEach 活动。
string[] names = { "bill", "steve", "ray" };
DelegateInArgument<object> iterationVariable = new DelegateInArgument<object>() { Name = "iterationVariable" };
Activity sampleUsage =
new ParallelForEach
{
Values = new InArgument<IEnumerable>(c=> names),
Body = new ActivityAction<object>
{
Argument = iterationVariable,
Handler = new WriteLine
{
Text = new InArgument<string>(env => string.Format("Hello {0}", iterationVariable.Get(env)))
}
}
};
ParallelForEach 设计器
此示例的活动设计器的外观与为内置 ParallelForEach 活动提供的设计器的外观相似。此设计器显示在工具箱的**“示例”->“非泛型活动”类别中。此设计器在工具箱中命名为“ParallelForEachWithBodyFactory”**,因为该活动在工具箱中公开了一个 IActivityTemplateFactory,后者使用正确配置的 ActivityAction 创建活动。
public sealed class ParallelForEachWithBodyFactory : IActivityTemplateFactory
{
public Activity Create(DependencyObject target)
{
return new Microsoft.Samples.Activities.Statements.ParallelForEach()
{
Body = new ActivityAction<object>()
{
Argument = new DelegateInArgument<object>()
{
Name = "item"
}
}
};
}
}
运行示例
将您选择的项目设置为解决方案的启动项目。
**“CodeTestClient”**演示如何使用代码来使用活动。
**“DesignerTestClient”**演示如何在设计器中使用活动。
生成和运行项目。
![]() |
---|
您的计算机上可能已安装这些示例。在继续操作之前,请先检查以下(默认)目录:
<安装驱动器>:\WF_WCF_Samples
如果此目录不存在,请转到 .NET Framework 4 的 Windows Communication Foundation (WCF) 和 Windows Workflow Foundation (WF) 示例(可能为英文网页),下载所有 Windows Communication Foundation (WCF) 和 WF 示例。此示例位于以下目录:
<安装驱动器>:\WF_WCF_Samples\WF\Scenario\ActivityLibrary\NonGenericParallelForEach
|