一、WorkflowInvoker

  常用方法如下:

方法 说明
BeginInvoke() 使用指定的 AsyncCallback 和用户提供的状态以异步方式调用工作流
EndInvoke() 返回使用一种 BeginInvoke 重载调用的工作流的结果
Invoke() 使用传递给 WorkflowInvoker 构造函数的工作流定义以同步方式调用工作流
CancelAsync() 尝试取消使用指定的 userState 调用的工作流

  WorkflowInvoker默认以宿主调用工作流,如果是WinForm程序,那么就是用UI线程调用工作流,在工作流完成前,UI一直处于等待状态而不可操作。

  其调用工作流的方式如下:

    static void Main(string[] args){Activity wf = new WriteLine{Text = "WorkflowInvoker调用工作流!"};WorkflowInvoker.Invoke(wf);Console.ReadKey();}

  WorkflowInvoker常用于学习,工作环境中常用的是WorkflowApplication。WorkflowInvoker不详细叙述,本篇主要将WorkflowApplication。

二、WorkflowApplication

  工作流宿主,经常使用它来创建工作流,它使用线程池里的线程执行。

  常用属性与方法如下:

属性/方法 说明
Aborted 获取或设置中止工作流实例时调用的 Action<T>
Completed 获取或设置工作流实例完成时调用的 Action<T>
Unloaded 获取或设置卸载当前工作流时调用的 Action<T>
Idle 获取或设置当前工作流实例进入空闲状态时调用的 Action<T>
Unloaded 获取或设置卸载当前工作流时调用的 Action<T>
WorkflowDefinition 获取工作流实例的工作流定义
PersistableIdle 获取或设置当前工作流实例处于空闲状态并可执行持续化时调用的 ActivityFunc
Id 获取当前工作流的Guid标识
InstanceStore 持续化用到的状态对象
Run() 开始或恢复执行工作流实例
ResumeBookmark() 恢复因为创建了书签而处于Idle状态的工作流运行
Abort() 中止此工作流实例
Cancel() 取消工作流实例
CreateDefaultInstanceOwner() 使用指定实例存储、定义标识和标识筛选器和超时间隔,创建工作流的默认实例所有者
DeleteDefaultInstanceOwner() 使用指定的实例存储区和超时间隔检索工作流的可运行实例
GetBookmarks() 获取工作流实例的书签的集合
GetInstance(Guid, InstanceStore) 使用指定的实例标识符和实例存储区检索工作流实例
Load(Guid) 将指定的工作流实例从实例存储区加载到内存中
LoadRunnableInstance() 从示例存储区加载可运行的工作流实例
Persist() 持续化工作流
Terminate() 终止工作流的运行
Unload() 持续化并且卸载工作流实例(可再次用Load()方法加载运行)

  http://msdn.microsoft.com/zh-cn/library/system.activities.workflowapplication(v=vs.110).aspx

    class Program{static void Main(string[] args){Activity wf = new WriteLine{Text = "WorkflowApplication调用工作流!"};WorkflowApplication instance1 = new WorkflowApplication(wf);instance1.Completed = workflowCompleted;instance1.Run();Console.WriteLine("Winform线程执行完毕! 线程:" + Thread.CurrentThread.ManagedThreadId);Console.ReadKey();}static void workflowCompleted(WorkflowApplicationCompletedEventArgs e){Thread.Sleep(1000);Console.WriteLine("流程执行完毕! 线程:" + Thread.CurrentThread.ManagedThreadId);}}

  其输出结果如下:

  

  从结果看出,Winform控制台程序主线程已经执行完毕,但工作流线程依然在执行。

  WorkflowApplication 承担实际 WorkflowInstance 的线程安全代理任务。

  1、WorkflowApplication 生命周期事件

  WorkflowApplication提供了对如下事件的处理事件,绑定到上面列表上的属性上。

  1. Completed:工作流执行完毕事件;
  2. Aborted:中止工作流事件;
  3. Idle 和 PersistableIdle:工作流空闲事件;
  4. OnUnhandledException:工作流发生未处理异常事件;

  下面以一个示例说明:该示例的作用如下:

  WorkflowApplication启动工作流 => 工作流运行过程中会根据自身状态,触发相应的事件,并执行所绑定的方法。

    static void Main(string[] args){AutoResetEvent syncEvent = new AutoResetEvent(false);Activity wf = new WriteLine{Text = "WorkflowApplication调用工作流!"};WorkflowApplication instance1 = new WorkflowApplication(wf);//当工作流执行完毕时要执行的方法instance1.Completed = delegate(WorkflowApplicationCompletedEventArgs e){Console.WriteLine("工作流线程执行完毕! 线程:" + Thread.CurrentThread.ManagedThreadId);//设置AutoResetEvent,允许WinForm主线程继续执行
            syncEvent.Set();};instance1.Run();syncEvent.WaitOne();Console.WriteLine("Winform线程执行完毕! 线程:" + Thread.CurrentThread.ManagedThreadId);Console.ReadKey();}

  输出如下:

  

  留意到以上代码,是工作流执行完毕之后,WinForm线程再继续执行。

  2、WorkflowApplication 传参

  

  3、实验性质的验证

  新建一个简单的工作流如下:

  

  其代码如下:

    class Program{//初始化工作流public static void IniWorkflow(SqlWorkflowInstanceStore instanceStore, InstanceView view, WorkflowApplication instance, AutoResetEvent idleEvent){string connectionString = "server=CZZ;database=xxoo;uid=sa;pwd=123";instanceStore = new SqlWorkflowInstanceStore(connectionString);view = instanceStore.Execute(instanceStore.CreateInstanceHandle(), new CreateWorkflowOwnerCommand(), TimeSpan.FromSeconds(30));instanceStore.DefaultInstanceOwner = view.InstanceOwner;instance.InstanceStore = instanceStore;instance.Idle = delegate(WorkflowApplicationIdleEventArgs e){Console.WriteLine("工作流进入空闲状态!");idleEvent.Set();};instance.Completed = delegate(WorkflowApplicationCompletedEventArgs e){Console.WriteLine("工作流执行完成!");idleEvent.Set();};instance.Unloaded = delegate(WorkflowApplicationEventArgs e){Console.WriteLine("工作流卸载!");};}static void Main(string[] args){InstanceView view = null;AutoResetEvent idleEvent = new AutoResetEvent(false);SqlWorkflowInstanceStore instanceStore = null;WorkflowApplication instance = new WorkflowApplication(new Workflow1());IniWorkflow(instanceStore, view, instance, idleEvent);Guid guid = instance.Id;instance.Run();idleEvent.WaitOne();Console.WriteLine("主线程恢复运行,暂停2秒");Thread.Sleep(2000);//多次卸载工作流
            instance.Unload();instance.Unload();instance.Unload();//用一个新的WorkflowApplication去装载工作流继续执行(模拟长时间)WorkflowApplication instance2 = new WorkflowApplication(new Workflow1());IniWorkflow(instanceStore, view, instance2, idleEvent);instance2.Load(guid);if (instance2.GetBookmarks().Count() > 0){Dictionary<string, object> dic = new Dictionary<string, object>();BookmarkResumptionResult BRR = instance2.ResumeBookmark("Bookmark", dic);}idleEvent.WaitOne();        instance.Unload();Console.WriteLine("控制台程序完成!");Console.ReadKey();}}

  运行结果如下:

  

  从以上的例子,我们可以得到如下信息:

  1、工作流完成后会自动卸载Unload(),并触发绑定的Unloaded处理事件。
  2、工作流多次卸载不会报错。

  这两个信息非常有用,因为知道了这两点,我们就可以不论什么时候,都可以WaitOne(),然后在Unload();

WF4 常用类第二篇相关推荐

  1. 备考计算机国一国二的文章,2020国家电网计算机类第二篇:新大纲如何备考

    原标题:2020国家电网计算机类第二篇:新大纲如何备考 [山西中公国企]今天小编给大家带来2020国家电网计算机类第二篇:新大纲如何备考.山西中公国企(sxgqzp)微信公众号为您持续导航~ 根据对近 ...

  2. HTML基础之常用标签第二篇:有序无序标签,以及框架标签

    上一篇聊了一些HTML中的一些基础标签,现在开始再聊HTML中的一些其它标签,比如有序无限标签,还有一些框架标签.表单标签涉及内容有点多,后面再来一篇. li <li> 标签定义列表项目. ...

  3. java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...

    23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...

  4. 第二周:java异常和常用类 容器

    一.java异常类 1.定义 异常就是在运行时产生的问题.通常用Exception描述. 在java中,把异常封装成了一个类,当出现问题时,就会创建异常类对象并抛出异常相关的信息(如详细信息,名称以及 ...

  5. Elasticsearch学习第二篇--常用的几种搜索方式

    Elasticsearch学习第二篇--常用的几种搜索方式 一.Query String Search 查询全部 条件查询 二.Query DSL 查询全部 条件查询 三.Query Filter 四 ...

  6. 【JAVASE(7)】JAVASE学习--注解及小众常用类篇

    A.注解--Annotation     一.概念:         注释:文字描述程序,给人看         注解:说明程序,给计算机看 1)从JDK5开始,Java增加对元数据的支持(MetaD ...

  7. Java基础-->一篇讲全Java常用类(详细易懂,建议收藏)

    Java基础–>一篇讲全Java常用类(详细易懂,建议收藏) 文章目录 Java基础-->一篇讲全Java常用类(详细易懂,建议收藏) 1.字符串相关的类 String类 概述 创建Str ...

  8. 【java学习之路】(java SE篇)007.常用类

    常用类 基本数据类型包装类 /*包装类和基本数据类型包装类是将基本数据类型封装成一个类,包含属性和方法使用:在使用过程中会涉及到自动装箱和自动拆箱装箱:将基本数据类型转换成包装类 intValue() ...

  9. 第二周预习:异常类,常用类,容器

    异常类 异常 异常:在程序的运行过程中,发生了不正常的现象,阻止了程序的运行,我们称之为发生异常. Java使用throw关键字抛出一个Exception子类的实例表示异常发生. try-catch语 ...

最新文章

  1. SearchHit转成java对象_Java开发中最常犯的10个错误,你中招了吗?
  2. Miniconda3的环境配置
  3. 关于 Head First SQL 中文版
  4. hashmap 扩容是元素还是数组_曹工说JDK源码(1)--ConcurrentHashMap,扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位?...
  5. python浮点数保留两位小数_(RPA)学习——Python 保存两位小数
  6. C++11 regex库
  7. Hadoop3.0.3-SYNTH运行
  8. Python 二次开发 AutoCAD 简介
  9. 关于流媒体压缩的问题xvidcore的问题
  10. 世界第一行销之神杰 亚伯拉罕首次中国大陆行
  11. 华三OSPF多区域配置实例
  12. qlv格式转换成mp4 视频格式转换
  13. 大汉诡辩达人陆贾的公关策略cathy荷塘月色新浪博客
  14. H5后台读写CAD文件
  15. Unity 3D模型展示框架篇之自由观察(Cinemachine)
  16. javax.servlet-api 简介、中文文档、中英对照文档 下载
  17. 计算机二级操作题相关笔记
  18. 工具篇 之 iTerm 2 用户名修改(基于 iTerm 2 + oh-my-zsh)
  19. Web 安全工具篇:Burp Suite 使用指南
  20. 【STC单片机学习】第十三课:串口通信和RS485

热门文章

  1. Date、String、Calendar类型之间的转化
  2. nodejs 安装express
  3. linux下python 2.4升级到 python 2.5
  4. Android 2.2 带来全新拍照增强特性
  5. 还是觉得应该动手写点东西....
  6. 把这个写成一个类吧TREEVIEW
  7. 新手与大佬学习方式的差异
  8. Spring Boot第一个简单返回html页面的程序
  9. 苹果系统中国日历服务器,AppleMac苹果电脑最好用的中国农历日历(TinyCal)v1.11.0
  10. JAVA大厂高频面试题及答案