出处:http://www.cnblogs.com/jiekzou/p/6192813.html

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

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

新建项目StatueWorkflowConsoleApp

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

运行结果如下:

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

1、设置全局变量Num

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

new Random().Next(0,10)

运行结果如下:

启动工作流

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

            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一个线程通过调用等待一个信号 WaitOne 上 AutoResetEvent

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

AutoResetEvent syncEvent = new AutoResetEvent(false);

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

syncEvent.Set();

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

syncEvent.WaitOne();

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

源码下载:WorkflowConsoleApp2.zip

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

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

    状态机工作流 在上一节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. 使用rollup 开发专业js library

    rollup 是一个不错的javascript 模块打包器,一般我们用来构建library 安装 npm install -g rollup 参考集成jquey && shortid ...

  2. vs2005 sp1 补丁的安装问题

    最近做windows mobile 6.0的手机软件开发,听说用vs2005 开发的话最少得装vs2005 sp1,于是去官网上下了VS80sp1-KB926604-X86-CHS.exe 补丁 .运 ...

  3. socket编程---UDP

    头文件 #include <sys/types.h> #include <sys/socket.h> 函数原型 int sendto (int s, const void *b ...

  4. [原创]JEECMS 自定义标签调用广告版位下的所有广告(利用广告管理管理首页幻灯片)

    JEECMS自带的只有[@cms_advertising]标签,并且官方没有给文档,用法: [@cms_advertising id='3']             <img src=&quo ...

  5. [转]基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作

    基于Oracle的EntityFramework的WEBAPI2的实现(一)——准备工作  转载请注明作者及来源:张峻崎,博客园 目前在.net的范围内,好的而且方便的ORM的真的不是很多,与VS集成 ...

  6. 【并发编程】Executor架构介绍

    要点总结 Executor表示的任务类型 主要有3种: Runnable: 无返回值,无异常抛出: Callable:有返回值,可以异常抛出: Future任务: 表示异步计算,可取消: 通过newT ...

  7. Bootstrap-CL:多媒体对象

    ylbtech-Bootstrap-CL:多媒体对象 1.返回顶部 1. Bootstrap 多媒体对象(Media Object) 本章我们将讲解 Bootstrap 中的多媒体对象(Media O ...

  8. python3调用阿里云短信服务

    #!/usr/bin/env python#-*- coding:utf-8 -*-#Author:lzd import uuidimport datetimeimport hmacimport ba ...

  9. 十二.jQuery源码解析之.eq().first().last().slice()

    eq(index):将集合中的索引为index的元素提取出来. first():返回集合中的第一个元素. .last():防护集合中的最后一个元素. .slice(start[,end]):返回集合中 ...

  10. Autofac框架详解

    一.组件 创建出来的对象需要从组件中来获取,组件的创建有如下4种(延续第一篇的Demo,仅仅变动所贴出的代码)方式: 1.类型创建RegisterType AutoFac能够通过反射检查一个类型,选择 ...