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