您可以将 ConditionedActivityGroup (CAG) 活动中的条件执行和循环混合在一起。CAG 包含一些子活动(可能是复合活动),并可运行这些活动,直至满足全局条件。基本上,CAG 组合了 While 和 IfElse 活动的行为。通过以下伪代码来表示内部逻辑:
While condition
If child1.WhenCondition Then child1.Execute
If child2.WhenCondition Then child2.Execute
:
If childN.WhenCondition Then childN.Execute
End While
每个子活动都有 WhenCondition 属性。根据对指定条件的计算,可以在当前的迭代中运行或跳过活动。请注意,如果子活动没有 WhenCondition 集合,子活动将只能在第一次被执行,并在后续的迭代中被跳过。如果需要,可以根据状态变化的依存关系对所有条件进行计算。
在 UntilCondition 返回“true”并立即取消所有当前正在执行的活动后,CAG 活动将终止。如果没有指定条件,当因为没有设置条件或者条件计算为“false”而没有子活动运行时,CAG 也将结束。
同步块
涉及交错活动的顺序工作流都会对共享成员的访问进行系列化。然而,操作是不同的。当两个或两个以上以交错方式运行的序列用到 Parallel 活动时,操作是不同的。请看一下图 5。While 活动包含两个序列块,然后,序列块又将 Parallel 活动和代码活动联系在一起。在内部,Parallel 活动有四个块,每个块都对定义为工作流类成员的数字执行数学运算。Parallel 活动的四个分支以交错方式执行。(每一次在工作流实例中只有一个线程。该线程在 Parallel 活动的分支间来回切换。)跨任务同步又如何呢?默认情况下,子活动内部运行的每一段代码都进行对共享成员的直接访问。
图 5平行任务(Click the image for a larger view)
根据图 5 所示的简单架构,可能会出现每个分支都作为一个原子操作来运行的情况。这纯属巧合,运行严格依据各操作的复杂性和持续时间。如果每个分支由多个活动组成,情况会怎样?SynchronizationScope 提供了声明性和明确的同步存取建模方法,它可以实现对一组活动中一个给定工作流实例内的共享状态进行同步存取。
SynchronizationScope 活动内运行的工作流部分是一种不能中断的原子操作。此处没有事务语义,SynchronizationScope 活动中包含的操作不能回滚。在所有基于活动(这些活动具有并行执行路径,如 Parallel、Replicator 和 CAG)的解决方案中,SynchronizationScope 活动起着关键作用。
图 6 可以帮助您快速体验 SynchronizationScope 活动的作用,该图是图 5 中工作流的修改版本。blockMultiply 活动对延迟交错的两个代码块进行计数。blockDivide 活动包含一个未同步的代码块。如果您将 blockMultiply 的内容放到同步范围之外,blockDivide 将可能在 blockMultiply 的延迟阶段执行。根据要进行的更新的种类不同,这可能会成为一个严重问题。SynchronizationScope 活动可确保工作流部分的连续性。
图 6 平行任务与同步范围(Click the image for a smaller view)
异常处理
正如其他基于 .NET 的应用程序一样,工作流能够引发和捕获异常。特别是,您可以使用 Throw 活动来引发一个特定的异常。Throw 活动需要几个设置 — 要引发的异常的类型,存储异常对象实例以进行进一步自定义的工作流类成员。只要在工作流项目中引用了类型,您就可以使用自定义的异常类型。
要捕获工作流活动引发的异常,您要添加 FaultHandler 活动。工作流设计器提供了一个用于您添加的错误处理程序的容器。每个处理程序一定是某个工作流的一部分,一旦捕获异常,该程序即执行。添加 FaultHandler 活动后,您可以定义要捕获的异常的类型。您可以通过 Fault 属性访问异常对象。值得注意的是,要可视化错误处理程序,您必须在 Visual Studio 2005 设计器中切换视图并通过单击设计器视图底部的选项卡列表来选择“View Faults(查看错误)”选项卡。
本新闻共
6页,当前在第
4页
1 2 3 4 5 6