状态机工作流

在上一节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. [算法]——快速排序(Quick Sort)

    顾名思义,快速排序(quick sort)速度十分快,时间复杂度为O(nlogn).虽然从此角度讲,也有很多排序算法如归并排序.堆排序甚至希尔排序等,都能达到如此快速,但是快速排序使用更加广泛,以至于 ...

  2. 浅谈Slick(2)- Slick101:第一个动手尝试的项目

    看完Slick官方网站上关于Slick3.1.1技术文档后决定开始动手建一个项目来尝试一下Slick功能的具体使用方法.我把这个过程中的一些了解和想法记录下来和大家一起分享.首先我用IntelliJ- ...

  3. Configure a bridged network interface for KVM using RHEL 5.4 or later?

    environment Red Hat Enterprise Linux 5.4 or later Red Hat Enterprise Linux 6.0 or later KVM virtual ...

  4. [转载]Java 8 日期&时间 API

    Java 8 日期和时间 声明 本文转自http://www.journaldev.com/2800/java-8-date-localdate-localdatetime-instant,以mark ...

  5. NoSql1 在Linux(CentOS)上安装memcached及使用

    前言:       今天是初五,生活基本要从过年的节奏中回归到正常的生活了,所以想想也该想想与工作有关的事情了.我之前在工作中会经常使用memcached和redis,但是自己一直没有时间系统的好好看 ...

  6. 前端自学路线之js篇

    上一篇我们讲了前端切图的学习路线,不知大家有没有收获.今天来聊聊前端工程师的核心技能之——JavaScript.js这门语言看似简单,但要做到入门.熟练以至于架构的程度,还是有一段路要走的,今天就来聊 ...

  7. nginx常用代理配置

    因为业务系统需求,需要对web服务作nginx代理,在不断的尝试过程中,简单总结了一下常见的nginx代理配置. 1. 最简反向代理配置 在http节点下,使用upstream配置服务地址,使用ser ...

  8. (转)linux下和云端通讯的例程, ubuntu和openwrt下实验成功(二)

    前言: 上节用纯linux的函数实现了和云端通讯, 本节开始利用传说中的神器libcurl 话说一个网络程序员对书法十分感兴趣,退休后决定在这方面有所建树. 于是花重金购买了上等的文房四宝.    一 ...

  9. 浅析Java 泛型

    泛型是JavaSE5引入的一个新概念,但是这个概念在编程语言中却是很普遍的一个概念.下面,根据以下内容,我们总结下在Java中使用泛型. 泛型使用的意义 什么是泛型 泛型类 泛型方法 泛型接口 泛型擦 ...

  10. 【原】彻底解决WPS弹出热点广告、WPS购物图标的办法

    一直用WPS,但一直有一个问题迟迟没有解决,那就是讨厌的WPS广告问题! 每次开机都会自动在托盘上闪烁图标:“WPS购物”和“WPS热点”! 用自定义托盘图标隐藏都不管用,自动又会给改回来!这简直是流 ...