状态机工作流
状态机是用于开发程序的已知范例。 StateMachine 活动与 State、Transition 以及其他活动一起可用于生成状态机工作流程序。 本主题概述如何创建状态机工作流。
状态机工作流概述
状态机工作流提供建模样式,使用该样式可以通过事件驱动方式对您的工作流进行建模。 StateMachine 活动包含状态和转换,它们构成了状态机的逻辑,并且可以在能够使用活动的任何地方使用。 状态机运行时有若干类:
为了创建状态机工作流,需要将状态将添加到 StateMachine 活动中,并且使用转换控制各状态之间的流。 截自入门教程中的步骤如何:创建状态机工作流的以下屏幕截图中显示具有三种状态和三个转换的状态机工作流。 “初始化目标”是初始状态,表示工作流中的第一个状态。 该状态由从“开始”节点通向它的线条指定。 工作流中的最终状态命名为 FinalState,表示完成工作流的那个时间点。
状态机工作流必须有且只有一个初始状态,并且至少有一个最终状态。 不属于最终状态的每个状态都必须具有至少一个转换。 下面的几节将介绍如何创建和配置状态和转换。
创建和配置状态
State 表示状态机可具有的状态。 要将 State 添加到工作流,请将“State”活动设计器从“工具箱”的“状态机”部分拖放到 Windows 工作流设计器图面上的 StateMachine 活动。
若要将某一状态配置为“初始状态”,请右击该状态,然后选择“设置为初始状态”。 此外,如果目前没有初始状态,则可以通过将线条从工作流顶部的“开始”节点拖到所需状态,指定初始状态。 在将 StateMachine 活动拖放到工作流设计器时,将会用名为 State1 的初始状态预先配置它。 一个状态机工作流必须有且只有一个初始状态。
表示状态机终止状态的状态称为最终状态。 最终状态是 IsFinal 属性设置为 true
、没有 Exit 活动且没有源自它的转换的一种状态。 若要将最终状态添加到工作流,请将“FinalState”活动设计器从“工具箱”的“状态机”部分拖放到 Windows 工作流设计器图面的 StateMachine 活动上。 一个状态机工作流必须具有至少一个最终状态。
配置进入和退出操作
一个状态可以具有一个 Entry 和一个 Exit 操作。 (配置为最终状态的状态只能具有一个进入操作)。 当某个工作流实例进入某一状态时,进入操作中的所有活动都将执行。 在该进入操作完成后,将计划针对状态转换的触发器。 当确认转换到另一状态时,即使该状态转换回相同状态,也将执行退出操作中的活动。 退出操作完成后,转换操作中的活动将执行,然后转换到新状态,并将计划其进入操作。
注意
当调试某一状态机工作流时,可以将断点放置在状态机根活动上以及状态机工作流内的状态上。 断点不能直接放置于转换上,但可以放置于状态和转换中包含的任何活动上。
创建和配置转换
所有状态必须均具有至少一个转换,只有最终状态除外,最终状态不能具有任何转换。 在某一状态添加到状态机工作流后可以添加转换,或者可以在删除状态时创建转换。
要在一个步骤中添加 State 并创建转换,请拖动“工具箱”的“状态机”部分中的“State”活动并将它悬停在工作流设计器中的另一状态上。 在另一个 State 上拖动 State 时,在另一个 State 周围将出现四个三角形。 如果将 State 放置到其中一个三角形,则将其添加到状态机,而且创建从源 State 到放置目标 State 的转换。 有关详细信息,请参阅 Transition 活动设计器。
若要在添加状态后创建转换,有两个选项。 第一个选项就是从工作流设计器图面拖动状态,并悬停在现有状态上,然后放置在其中一个放置点上。 这个选项与上一节中介绍的方法相似。 您也可以将鼠标悬停在所需的源状态上,然后拖动线条到所需的目标状态上。
注意
状态机中的单个状态使用工作流设计器可以创建多达 76 个转换。 对在设计器外创建的工作流状态的转换限制只受系统资源限制。
一个转换可以具有一个 Trigger、一个 Condition 和一个 Action。 在转换的源状态的 Trigger 操作完成时,将会计划转换的 Entry。 通常,Trigger 是一种等待某种类型的事件发生的活动,但它可以是任何活动,也可以是完全没有任何活动。 在 Trigger 活动完成后,将会对 Condition(如果有)进行计算。 如果没有 Trigger 活动,则立即对 Condition 进行计算。 如果条件的计算结果为 false
,则取消转换,并且来自该状态的所有转换的 Trigger 活动都将重新计划。 如果存在与当前转换共享相同源状态的其他转换,也将取消并且重新计划这些 Trigger 操作。 如果 Condition 的计算结果为 true
或没有任何条件,则执行源状态的 Exit 操作,然后执行转换的 Action。 在 Action 完成后,控制权将传递给“目标”状态
共享公共触发器的转换称作共享触发器转换。 一组共享触发器转换中的每个转换都具有相同触发器,但具有唯一的 Condition 和 Action。 若要将其他操作添加到转换和创建共享转换,请单击指示所需转换的开始的圆并将它拖到所需的状态。 新转换将与初始转换共享相同的触发器,但它将具有一个唯一的条件和操作。 也可以通过单击转换设计器底部的“添加共享的触发器转换”,再选择“连接的可用状态”下列表中的所需目标状态,在转换设计器中创建共享转换。
注意
注意,如果转换的 Condition 计算结果为 False
(或所有共享触发转换条件的计算结果均为 False
),转换将不发生,并且此状态下的所有转换的所有触发将被重新计划。
有关创建状态机工作流的详细信息,请参阅如何:创建状态机工作流、状态机活动设计器、状态活动设计器、最终状态活动设计器和转换活动设计器。
状态机术语
本节定义本主题中使用的状态机词汇。
状态
构成状态机的基本单位。 状态机在任何特定时间都可处于某一状态。
进入操作
进入状态时执行的活动
退出操作
退出状态时执行的活动
切换
两个状态之间的定向关系,表示状态机对发生的特定类型事件的整个响应。
共享转换
与一个或多个转换共享源状态和触发器、但具有唯一条件和操作的一种转换。
触发器
导致转换发生的触发活动。
天气条件
一个约束条件,该约束的计算结果必须为 true
,然后触发器才会发生以便完成转换。
转换操作
在执行某个转换时执行的活动。
条件转换
具有显式条件的转换。
自行转换
从某一状态转换到该状态本身的一种转换。
初始状态
表示状态机起始点的一种状态。
最终状态
表示状态机完成的一种状态。