使用本机活动的自定义复合
CustomCompositeNativeActivity 示例演示如何编写一个 NativeActivity,使其安排其他 Activity 对象来控制工作流的执行流。 此示例使用两个通用的控制流(Sequence 和 While)来演示如何做到这一点。
示例详细信息
从 MySequence
开始,首要要注意的事情是,它派生自 NativeActivity。 NativeActivity 是 Activity 对象,它通过传递给 NativeActivityContext 方法的 Execute
公开整个工作流运行时范围。
MySequence
公开 Activity 对象的一个公共集合,此对象集合由工作流作者填充。 在执行工作流之前,工作流运行时会对工作流中的每个活动调用 CacheMetadata 方法。 在此过程中,运行时将建立用于数据范围限定和生存期管理的父子关系。 CacheMetadata 方法的默认实现使用 MySequence
活动的 TypeDescriptor 实例类来添加 Activity 或 IEnumerable<Activity> 类型的任何公共属性作为 MySequence
活动的子级。
当一个活动公开子级活动的公共集合时,这些子级活动可能会共享状态。 对于父级(在此例中为 MySequence
)而言,最佳做法是也公开一个变量集合,以便子级活动能够通过这些变量来完成上述任务。 与子级活动类似,CacheMetadata 方法将添加 Variable 或 IEnumerable<Variable> 类型的公共属性作为与 MySequence
活动关联的变量。
除了由 MySequence
的子级操作的公共变量之外,MySequence
还必须跟踪它在执行其子级时的位置。 为了完成此任务,它使用一个私有变量 currentIndex
。 通过在 MySequence
活动的 AddImplementationVariable 方法内添加对 MySequence
方法的调用,将此变量作为 CacheMetadata 环境的一部分进行注册。 添加到 MySequence
Activities
集合的 Activity 对象无法访问通过这种方式添加的变量。
当运行时执行 MySequence
时,运行时将调试其 Execute 方法,并传入一个 NativeActivityContext。 NativeActivityContext 是活动的回归运行时的代理,用于取消引用参数和变量以及安排其他 Activity 对象或 ActivityDelegates
。 MySequence
使用 InternalExecute
方法封装在单一方法中计划第一个子级和所有后续子级的逻辑。 它首先取消引用 currentIndex
。 如果它等于 Activities
集合中的计数,则完成序列,该活动将返回而不计划任何工作,并且运行时将它移动到 Closed 状态。 如果 currentIndex
小于活动的计数,则从 Activities
集合获取下一个子级,然后 MySequence
调用 ScheduleActivity,并传入要计划的子级和一个指向 InternalExecute
方法的 CompletionCallback。 最后,递增 currentIndex
,并将控制权交回给运行时。 只要 MySequence
的实例已计划一个 Activity 对象,运行时就会认为它处于“正在执行”状态。
当子级活动完成时,将执行 CompletionCallback。 循环将从顶部继续。 与 Execute
类似,CompletionCallback 采用一个 NativeActivityContext,以便实现者能够访问运行时。
MyWhile
与 MySequence
的不同之处在于,它会重复计划一个 Activity 对象,并使用一个名为Condition
的 Activity<TResult><bool> 来确定此计划是否应发生。 与 MySequence
类似,MyWhile
使用 InternalExecute
方法来集中其计划逻辑。 它通过使用一个名为 OnEvaluationCompleted
的 CompletionCallback<TResult><bool> 来计划 Condition
Activity<bool>。 执行完 Condition
之后,可以通过此 CompletionCallback 在一个名为 result
的强类型参数中获得执行结果。 如果结果为 true
,MyWhile
将调用 ScheduleActivity,并传入 Body
Activity 对象和 InternalExecute
作为 CompletionCallback。 执行完 Body
之后,在 Condition
中又会再次计划 InternalExecute
,开始再次循环。 如果 Condition
返回 false
,则 MyWhile
的实例会将控制权交回给运行时而不计划 Body
,运行时会将其移动到 Closed 状态。
设置、生成和运行示例
在 Visual Studio 中打开 Composite.sln 示例解决方案。
生成并运行解决方案。