状态机工作流

在上一节Workflow笔记1——工作流介绍中,介绍的是流程图工作流,后来微软又推出了状态机工作流,它比流程图功能更加强大。

状态机工作流:就是将工作流系统中的所有的工作节点都可以看做成一个状态节点。每个节点都有N个状态,其中都包含初始状态、进入状态、离开状态等。当节点的状态变化的时候会执行某个节点。

新建项目StatueWorkflowConsoleApp

自动添加了一个起始节点和一个状态节点.

运行结果如下:

注意执行顺序。接下来,扩展此工作流。

1、设置全局变量Num

2、双击T1,为变量Num赋值

new Random().Next(,)

运行结果如下:

启动工作流

之前我们新建的工作流项目,都是通过如下方式来启动工作流的。

            Activity workflow1 = new Workflow1();
WorkflowInvoker.Invoke(workflow1);

而在工作中,我们通常不能通过这样的方式来启动工作流。因为我们的流程启动后,我需要监控流程的各种状态。而我们通过Invoke的方式启动工作流,是无法监控工作流的状态的。我们可以通过WorkflowApplication类启动工作流。参考:https://msdn.microsoft.com/zh-cn/library/system.activities.workflowapplication(v=vs.110).aspx

WorkflowInvoker 包含同步调用工作流的实例方法和静态方法。WorkflowInvoker 不允许实例控件,如保持、卸载或恢复书签。

WorkflowApplication 类为单个工作流实例提供宿主。 它是由工作流运行时管理的实际工作流实例的代理。

  • 创建新的工作流实例,或从实例存储区中加载工作流实例。
  • 提供扩展以供工作流实例内的活动使用。
  • 控制工作流实例的执行。
  • 恢复由工作流实例内的活动创建的书签。
  • 保留或卸载工作流实例。
  • 接收工作流实例生命周期事件通知。

1、新建Windows窗体应用程序,WindowsWorkFlowApp

2、右键单击项目WindowsWorkFlowApp,新建活动,添加状态机

3、双击State1,添加输入参数

4、再添加一个状态和结束状态

5、双击FinalState,在其中添加输出

修改State2

6、修改“启动工作流”按钮的事件代码如下:

        private void btnStartWorkFlow_Click(object sender, EventArgs e)
{
WorkflowApplication app = new WorkflowApplication(new Activity1(), new Dictionary<string, object>() {
{"InputName","神刀张三"}
});
app.Run();
}

我们来看下WorkflowApplication的构造函数。

构造函数

名称

说明

WorkflowApplication(Activity)

使用指定的工作流定义创建 WorkflowApplication 类的新实例。

WorkflowApplication(Activity, IDictionary<String, Object>)

创建 WorkflowApplication 类的新实例,该实例使用指定的工作流定义和参数值。

WorkflowApplication(Activity, IDictionary<String, Object>, WorkflowIdentity)

创建的新实例 WorkflowApplication 类,该类使用指定的工作流定义和参数值和定义标识。

WorkflowApplication(Activity, WorkflowIdentity)

创建的新实例 WorkflowApplication 使用指定的工作流定义和定义标识的类。

7、由于我创建的是Windows应用程序,那么要想输出控制台信息,我们必须修改项目的输出方式

8、运行项目

WorkflowApplication生命周期

那么我们如何来监控工作流的状态呢,我们可以使用指定的工作流定义构造 WorkflowApplication,处理所需的工作流生命周期事件,并通过调用 Run 来调用工作流。

在Run方法调用之前,我们来注册生命周期事件,添加代码如下:

 #region 工作流生命周期事件
app.Unloaded = delegate(WorkflowApplicationEventArgs er)
{
Console.WriteLine("工作流 {0} 卸载.", er.InstanceId);
};
app.Completed = delegate(WorkflowApplicationCompletedEventArgs er)
{
Console.WriteLine("工作流 {0} 完成.", er.InstanceId);
};
app.Aborted = delegate(WorkflowApplicationAbortedEventArgs er)
{
Console.WriteLine("工作流 {0} 终止.", er.InstanceId);
};
app.Idle = delegate(WorkflowApplicationIdleEventArgs er)
{
Console.WriteLine("工作流 {0} 空闲.", er.InstanceId);
};
app.PersistableIdle = delegate(WorkflowApplicationIdleEventArgs er)
{
Console.WriteLine("持久化");
return PersistableIdleAction.Unload;
};
app.OnUnhandledException = delegate(WorkflowApplicationUnhandledExceptionEventArgs er)
{
Console.WriteLine("OnUnhandledException in Workflow {0}\n{1}",
er.InstanceId, er.UnhandledException.Message);
return UnhandledExceptionAction.Terminate;
};
#endregion

再次运行项目,结果如下:

多线程信号量机制

Run方法会开启一个新的线程。而通常,我们需要等待工作流运行完成之后再回到主线程。那么我们可以使用AutoResetEvent一个线程通过调用等待一个信号 WaitOneAutoResetEvent

在工作流实例化之前,就创建一个AutoResetEvent对象。

AutoResetEvent syncEvent = new AutoResetEvent(false);

然后在工作流的Completed事件中,执行Set方法,将事件状态设置为有信号,从而允许一个或多个等待线程继续执行,说白了就是一个唤醒操作。

syncEvent.Set();

最后在Run方法的后面,添加

syncEvent.WaitOne();

WaitOne方法将阻止当前线程,直到当前 WaitHandle 收到信号,从而实现等待工作流线程运行完成的功能。

源码下载:WorkflowConsoleApp2.zip

Workflow笔记2——状态机工作流的更多相关文章

  1. Workflow笔记2——状态机工作流(转)

    出处:http://www.cnblogs.com/jiekzou/p/6192813.html 在上一节Workflow笔记1——工作流介绍中,介绍的是流程图工作流,后来微软又推出了状态机工作流,它 ...

  2. WWF3状态机工作流<WWF第七篇>

    状态机是另外一种常见的工作流类型.它是以状态的变迁为驱动而进行业务流转的,是一定需要人为干预的,而不像顺序类型工作流那样可以按照事先设计好的业务流程一步一步依次执行下去. 一.状态机工作流范例 Sta ...

  3. SharePoint 2013 状态机工作流之扩展自定义状态

    当我们使用SharePoint 2013的状态机工作流时,发现一个非常不爽的事情,就是SharePoint 所有的工作流状态,都是固定的那些,没办法显示我们自定义的状态,后来经过Google发现,原来 ...

  4. SharePoint 2013 状态机工作流之日常报销示例

    简单介绍下状态机工作流,状态机工作流提供了一系列的状态.工作流从初始状态开始,到终止状态结束.两个状态之间定义行为进行过渡.通常情况下,状态机工作流对事件作出反应,事件的发生将会使状态发生改变. 1. ...

  5. 状态机工作流,顺序工作流和Flowchart

    什么是工作流,工作流可以说是对业务处理过程的建模,当我们设计工作流的时候,我们首先要分析业务处理过程中要经历的步骤.然后,我们就可以利用WF创建工作流模型来模拟业务的处理过程. WF工作流包含两种类型 ...

  6. Workflow笔记1——工作流介绍

    什么是工作流? 工作流(Workflow),是对工作流程及其各操作步骤之间业务规则的抽象.概括.描述.BPM:是Business Process Management的英文字母缩写.即业务流程管理,是 ...

  7. Workflow笔记3——BookMark和持久化

    BookMark 我们在平时的工作流使用中,并不是直接这样一气呵成将整个工作流直接走完的,通常一个流程到了某一个节点,该流程节点的操作人,可能并不会马上去处理该流程,而只有当处理人处理了该流程,流程才 ...

  8. odoo10学习笔记六:工作流、安全机制、向导

    转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189289.html 一:工作流 工作流是与业务流程相关联的模型,可用于跟踪工序的动态演变过程. 工作流. ...

  9. SharePoint 2013 状态机工作流之UpdateItemActivity

    没什么可说的,一个Activity的使用介绍,其他类似的Activity也可以参考这个使用. 1.添加ApplyActivation和UpdateItemActivity,在onWorkflowAct ...

随机推荐

  1. ubuntu 下安装scrapy

    1.把Scrapy签名的GPG密钥添加到APT的钥匙环中: sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 6272 ...

  2. jQuery个性化图片轮播效果

    jQuery个性化图片轮播效果 购物产品展示:图片轮播器<效果如下所示> 思路说明: 每隔一段时间,实现图片的自动切换及选项卡选中效果,鼠标划入图片动画停止,划出或离开动画开始 两个区域: ...

  3. Javascript学习笔记

    Javascript 2016年12月19日整理 JS基础 Chapter1 JS是一门运行在浏览器客户端的脚本编程语言,前台语言 组成部分 1. ECMAscript JS标准 2. DOM 通过J ...

  4. iOS开源项目周报1229

    由OpenDigg 出品的iOS开源项目周报第三期来啦.我们的iOS开源周报集合了OpenDigg一周来新收录的优质的iOS开发方面的开源项目,方便iOS开发人员便捷的找到自己需要的项目工具等. Ma ...

  5. mysql查询性能优化

    mysql查询过程: 客户端发送查询请求. 服务器检查查询缓存,如果命中缓存,则返回结果,否则,继续执行. 服务器进行sql解析,预处理,再由优化器生成执行计划. Mysql调用存储引擎API执行优化 ...

  6. win10电脑优化

    Windows10必做的优化 --道心 关闭服务 右键点击"此电脑",选择"管理",进入"计算机管理"窗口. 在左侧的菜单选择"服 ...

  7. XSS 前端防火墙 —— 整装待发

    到目前为止,我们把能用前端脚本防御 XSS 的方案都列举了一遍. 尽管看起来似乎很复杂累赘,不过那些是理论探讨而已,在实际中未必要都实现.我们的目标只是为了预警,能发现问题就行,并非要做到滴水不漏的程 ...

  8. 【Java并发编程实战】-----“J.U.C”:CAS操作

    CAS,即Compare and Swap,中文翻译为"比较并交换". 对于JUC包中,CAS理论是实现整个java并发包的基石.从整体来看,concurrent包的实现示意图如下 ...

  9. ABP源码分析四十六:ABP ZERO中的Ldap模块

    通过AD作为用户认证的数据源.整个管理用户认证逻辑就在LdapAuthenticationSource类中实现. LdapSettingProvider:定义LDAP的setting和提供Defaut ...

  10. 读取xml数据装配到字典中

    public Dictionary<string, string> GetXml() { Dictionary<string, string> dic = new Dictio ...