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

出处: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

时间: 2024-08-27 15:12:06

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

Workflow笔记二

状态机工作流 在上一节Workflow笔记1——工作流介绍中,介绍的是流程图工作流,后来微软又推出了状态机工作流,它比流程图功能更加强大. 新建项目StatueWorkflowConsoleApp 自动添加了一个起始节点和一个状态节点. 运行结果如下: 注意执行顺序.接下来,扩展此工作流. 1.设置全局变量Num 2.双击T1,为变量Num赋值 new Random().Next(0,10) 运行结果如下: 启动工作流 之前我们新建的工作流项目,都是通过如下方式来启动工作流的. Activity

状态机工作流

状态机工作流 状态机工作流通常用于模拟不能被预测人类行为时的事件流的一种替代方案,例如,在一个审批流程中,当事件驱动流程执行的过程,通常作为外部事件和导向转换, 通常作为外部事件和引导其他可能的状态之间的转换.状态机工作流的必须包括initial状态和 final 状态,用以表示该进程的启动和完成状态.这是一个灵活的逻辑流程,可以在工作流的状态间来回循环,因为外部事件驱动一个状态机工作流,他们在本质上是被动的. 这里面包含几个比较重要的基础元素 State Entry(进入状态),State E

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

原文:SharePoint 2013 状态机工作流之日常报销示例 简单介绍下状态机工作流,状态机工作流提供了一系列的状态.工作流从初始状态开始,到终止状态结束.两个状态之间定义行为进行过渡.通常情况下,状态机工作流对事件作出反应,事件的发生将会使状态发生改变. 1.新建项目,选择SharePoint解决方案,创建空项目: 2.选择调试站点,部署为场解决方案,如下图: 3.添加新项,选择“Office/SharePoint”下面的“状态机工作流(仅场解决方案)”: 4.选择列表工作流,修改工作流名

SharePoint 2013 状态机工作流之UpdateItemActivity

原文:SharePoint 2013 状态机工作流之UpdateItemActivity 没什么可说的,一个Activity的使用介绍,其他类似的Activity也可以参考这个使用. 1.添加ApplyActivation和UpdateItemActivity,在onWorkflowActivated1节点的下面,setStateActivity1节点的上面,如下图: 2.配置ApplyActivation的_Context,新建字段,记得是字段,不是属性: 3.配置ApplyActivatio

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

原文:SharePoint 2013 状态机工作流之扩展自定义状态 当我们使用SharePoint 2013的状态机工作流时,发现一个非常不爽的事情,就是SharePoint 所有的工作流状态,都是固定的那些,没办法显示我们自定义的状态,后来经过Google发现,原来这个状态是可以自定义的. 自定义状态步骤 1.  修改xml添加MetaData下面的扩展项: <ExtendedStatusColumnValues> <StatusColumnValue>测试状态1</Sta

状态机工作流&lt;WWF第七篇&gt;

状态机是另外一种常见的工作流类型.它是以状态的变迁为驱动而进行业务流转的,是一定需要人为干预的,而不像顺序类型工作流那样可以按照事先设计好的业务流程一步一步依次执行下去. 一.状态机工作流范例 State活动有三种状态类型: 起始状态: 业务逻辑过程状态: 终止状态: 在一个状态机工作流中起始状态和终止状态只能有一个.状态机工作流是从起始状态开始执行,在运行过程中通过业务员逻辑状态的变迁来进行工作流的流转,最终由终止状态标记工作流的结束.因此在状态机工作流设计界面上只能添加"State"

关于状态机工作流的编程方法

还没想好怎么写,先起了个古怪的名字.好吧,这篇文章纯属拔草之作,只讲一种大概的解决方案. 不过,我们大概得先解决掉两个概念:一个是状态机,一个是工作流. 什么是状态机?大概来说,就是我这里有一堆的状态,我在进行一项工作的时候,有一系列的状态:我要从一个状态转移到另一个状态.举个最简单的栗子:比如一个灯泡,有“开着”和“关着”两种状态.我对这个灯泡的操作是扳动开关,灯“开着”的时候,我按关灯,就到“关着”的状态:如果我再按开灯,就到了“开着”的状态.用状态转移图来表示大概是这样的: 什么是工作流?

Workflow笔记一

什么是工作流? 工作流(Workflow),是对工作流程及其各操作步骤之间业务规则的抽象.概括.描述.BPM:是Business Process Management的英文字母缩写.即业务流程管理,是一套达成企业各种业务环节整合的全面管理模式. 工作流软件,顾名思义,就是业务信息数据在多个环节模块之间的流转.企业内部业务种类非常多.变化也非常多.虽然业务变化非常多,但是流程的控制基本是不变的.我们常说的工作流或者是“流程”就是指 控制流程流转的核心引擎. 市面常见的工作流开发框架如下所示. Wi

Workflow笔记3——BookMark和持久化

BookMark 我们在平时的工作流使用中,并不是直接这样一气呵成将整个工作流直接走完的,通常一个流程到了某一个节点,该流程节点的操作人,可能并不会马上去处理该流程,而只有当处理人处理了该流程,流程才会继续往下走.对于不同流程节点的处理人,他所能处理的是不同的流程节点. 就好像我们看书,我们需要书签来标识,我现在已经看到哪个地方了,工作流也是一样的,我需要通过书签,来确定不同角色的人能处理的是哪一个流程. 1.在项目WindowsWorkFlowApp中,新建“代码活动” BookMarkCod