使用本机活动的自定义复合

CustomCompositeNativeActivity 示例演示如何编写一个 NativeActivity,使其安排其他 Activity 对象来控制工作流的执行流。 此示例使用两个通用的控制流(Sequence 和 While)来演示如何做到这一点。

示例详细信息

MySequence 开始,首要要注意的事情是,它派生自 NativeActivityNativeActivityActivity 对象,它通过传递给 NativeActivityContext 方法的 Execute 公开整个工作流运行时范围。

MySequence 公开 Activity 对象的一个公共集合,此对象集合由工作流作者填充。 在执行工作流之前,工作流运行时会对工作流中的每个活动调用 CacheMetadata 方法。 在此过程中,运行时将建立用于数据范围限定和生存期管理的父子关系。 CacheMetadata 方法的默认实现使用 MySequence 活动的 TypeDescriptor 实例类来添加 ActivityIEnumerable<Activity> 类型的任何公共属性作为 MySequence 活动的子级。

当一个活动公开子级活动的公共集合时,这些子级活动可能会共享状态。 对于父级(在此例中为 MySequence)而言,最佳做法是也公开一个变量集合,以便子级活动能够通过这些变量来完成上述任务。 与子级活动类似,CacheMetadata 方法将添加 VariableIEnumerable<Variable> 类型的公共属性作为与 MySequence 活动关联的变量。

除了由 MySequence 的子级操作的公共变量之外,MySequence 还必须跟踪它在执行其子级时的位置。 为了完成此任务,它使用一个私有变量 currentIndex。 通过在 MySequence 活动的 AddImplementationVariable 方法内添加对 MySequence 方法的调用,将此变量作为 CacheMetadata 环境的一部分进行注册。 添加到 ActivityMySequence 集合的 Activities 对象无法访问通过这种方式添加的变量。

当运行时执行 MySequence 时,运行时将调试其 Execute 方法,并传入一个 NativeActivityContextNativeActivityContext 是活动的回归运行时的代理,用于取消引用参数和变量以及安排其他 Activity 对象或 ActivityDelegatesMySequence 使用 InternalExecute 方法封装在单一方法中计划第一个子级和所有后续子级的逻辑。 它首先取消引用 currentIndex。 如果它等于 Activities 集合中的计数,则完成序列,该活动将返回而不计划任何工作,并且运行时将它移动到 Closed 状态。 如果 currentIndex 小于活动的计数,则从 Activities 集合获取下一个子级,然后 MySequence 调用 ScheduleActivity,并传入要计划的子级和一个指向 InternalExecute 方法的 CompletionCallback。 最后,递增 currentIndex,并将控制权交回给运行时。 只要 MySequence 的实例已计划一个 Activity 对象,运行时就会认为它处于“正在执行”状态。

当子级活动完成时,将执行 CompletionCallback。 循环将从顶部继续。 与 Execute 类似,CompletionCallback 采用一个 NativeActivityContext,以便实现者能够访问运行时。

MyWhileMySequence 的不同之处在于,它会重复计划一个 Activity 对象,并使用一个名为ConditionActivity<TResult><bool> 来确定此计划是否应发生。 与 MySequence 类似,MyWhile 使用 InternalExecute 方法来集中其计划逻辑。 它通过使用一个名为 OnEvaluationCompletedCompletionCallback<TResult><bool> 来计划 ConditionActivity<bool>。 执行完 Condition 之后,可以通过此 CompletionCallback 在一个名为 result 的强类型参数中获得执行结果。 如果结果为 trueMyWhile 将调用 ScheduleActivity,并传入 BodyActivity 对象和 InternalExecute 作为 CompletionCallback。 执行完 Body 之后,在 Condition 中又会再次计划 InternalExecute,开始再次循环。 如果 Condition 返回 false,则 MyWhile 的实例会将控制权交回给运行时而不计划 Body,运行时会将其移动到 Closed 状态。

设置、生成和运行示例

  1. 在 Visual Studio 中打开 Composite.sln 示例解决方案。

  2. 生成并运行解决方案。