WF编程学习 基本活动:状态活动

2024-04-02 09:38

本文主要是介绍WF编程学习 基本活动:状态活动,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

到目前为止,我们所讨论的工作流都是顺序工作流,而WF还支持另外一种工作流机制-状态机(State-Machine)工作流,本节就来介绍这些在状态机工作流中工作的活动.

  一个状态机是由一系列状态(State)组成的.譬如,用来模拟软件bug跟踪的状态机工作流也许会包含以下四个状态:开启,分配,关闭和延期,工作流总是处于其中一个状态中.状态机的执行完全依靠事件来驱动.只有当工作流接收到适当的事件,才可以从当前的状态转换到一个新的状态.一个状态机必须包含一个起始状态和一个可选的结束状态.当工作流转换到结束状态时,工作流就完成了.

  状态机工作流适合于模拟由外部决策来驱动执行的工作流.当我们做出了决策,比如关闭一个bug,我们需要一个本地通信服务来为工作流触发事件.工作流知道当前所处状态和可能将要转换到的状态.譬如,我们规定一个开启的bug必须在关闭之前被分配给相关人员,但它也可以从开启状态直接转换到延期状态.我们在建立一个状态机时,第一步就是定义这些状态.

  StateActivity

  State活动用来表示状态机的一个状态.例如我们的bug跟踪工作流将会包含4个State活动,分别代表开启,关闭,延期和分配这四种状态.和顺序工作流有所不同的是我们可以把这些活动拖放到设计器的任何位置,因为状态机并不会以特定的顺序从这个活动移动到下一个活动,而是由我们来定义合适的状态转换.

  每个状态机工作流都需要一个起始状态(Initial State).我们可以使用工作流本身的InitialStateName属性来设置起始状态.还可以根据需要设置CompletedStateName属性来指定工作流的结束状态.

InitialStateName属性

  我们可以为这些活动添加下面将要介绍的子活动.需要注意的是,我们还可以在State活动中嵌套State活动,嵌套的状态允许子状态继承父状态的事件和行为.这部分将会在以后的章节中详细介绍.

  StateInitializationActivity

  StateInitialization活动是一个顺序复合活动.作为状态的起始活动,状态机切换到一个状态后, 会首先执行这个活动的子活动.状态中只能包含一个起始活动,当我们添加了这个活动之后,就可以双击它来编辑它的子活动.

StateInitialization活动

  StateFinalizationActivity

  和起始活动类似,StateFinalization活动也是一个顺序复合活动.作为状态的结束活动,状态机转换到当前状态之外时,这个活动就会被执行.状态中也只能包含一个结束活动.

  EventDrivenActivity

  EventDriven活动也是一个顺序复合活动.只有当事件到达的时候EventDriven户活动才会被执行.EventDriven活动的第一个子活动必须实现IEventActivity接口(譬如HandleExternalEvent活动).还记得Listen活动吗?与之类似,State活动可以包含多个EventDriven活动.例如OpenState状态就包含2个EventDriven活动-一个用来处理BugAssigned事件,另一个用来处理BugDeferred事件.我们不允许OpenState处理BugClosed事件,因为我们不需要在bug没有被分配之前就转换到关闭状态中.

  在下图中,双击OpenState的EventDriven活动来配置BugAssigned事件的处理程序.我们将使用之前介绍过的HandleExternalEvent活动来处理这个事件(包含定义BugAssigned事件的接口必定被ExternalDataExchange特性修饰).处理完外部事件之后,我们将从当前的状态转换到另外的状态,这就得借助EventDriven的一个子活动-SetState活动.

  配置BugAssigned事件

  SetStateActivity

  SetState活动的作用是转换状态机到新的状态.在上图中,我们处理了BugAssigned事件.当bug被分配后,我们希望状态转换到AssignedState,实现状态间的转换很简单,我们只需要设置SetState活动的TargetStateName属性为AssignedState即可.而下一个状态-AssignedState活动也包含它自己的EventDriven活动以及用来转换到其它状态的SetState活动 (当然,状态最终还是会转换到ClosedState).

  状态机的工作流视图会检查SetState活动并通过状态之间的连接线来表示它们的关系.例如下边的状态机工作流,我们可以看到,只有AssignedState会转换到ClosedState.

  状态机的工作流视图

  点击查看原文>>

这篇关于WF编程学习 基本活动:状态活动的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/869632

相关文章

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Java并发编程必备之Synchronized关键字深入解析

《Java并发编程必备之Synchronized关键字深入解析》本文我们深入探索了Java中的Synchronized关键字,包括其互斥性和可重入性的特性,文章详细介绍了Synchronized的三种... 目录一、前言二、Synchronized关键字2.1 Synchronized的特性1. 互斥2.

Python异步编程中asyncio.gather的并发控制详解

《Python异步编程中asyncio.gather的并发控制详解》在Python异步编程生态中,asyncio.gather是并发任务调度的核心工具,本文将通过实际场景和代码示例,展示如何结合信号量... 目录一、asyncio.gather的原始行为解析二、信号量控制法:给并发装上"节流阀"三、进阶控制

SpringBoot整合MybatisPlus的基本应用指南

《SpringBoot整合MybatisPlus的基本应用指南》MyBatis-Plus,简称MP,是一个MyBatis的增强工具,在MyBatis的基础上只做增强不做改变,下面小编就来和大家介绍一下... 目录一、MyBATisPlus简介二、SpringBoot整合MybatisPlus1、创建数据库和

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Flutter监听当前页面可见与隐藏状态的代码详解

《Flutter监听当前页面可见与隐藏状态的代码详解》文章介绍了如何在Flutter中使用路由观察者来监听应用进入前台或后台状态以及页面的显示和隐藏,并通过代码示例讲解的非常详细,需要的朋友可以参考下... flutter 可以监听 app 进入前台还是后台状态,也可以监听当http://www.cppcn

Python中多线程和多进程的基本用法详解

《Python中多线程和多进程的基本用法详解》这篇文章介绍了Python中多线程和多进程的相关知识,包括并发编程的优势,多线程和多进程的概念、适用场景、示例代码,线程池和进程池的使用,以及如何选择合适... 目录引言一、并发编程的主要优势二、python的多线程(Threading)1. 什么是多线程?2.

MySQL 中的服务器配置和状态详解(MySQL Server Configuration and Status)

《MySQL中的服务器配置和状态详解(MySQLServerConfigurationandStatus)》MySQL服务器配置和状态设置包括服务器选项、系统变量和状态变量三个方面,可以通过... 目录mysql 之服务器配置和状态1 MySQL 架构和性能优化1.1 服务器配置和状态1.1.1 服务器选项

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操