WF4 常用类第二篇
一、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提供了对如下事件的处理事件,绑定到上面列表上的属性上。
- Completed:工作流执行完毕事件;
- Aborted:中止工作流事件;
- Idle 和 PersistableIdle:工作流空闲事件;
- 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 常用类第二篇相关推荐
- 备考计算机国一国二的文章,2020国家电网计算机类第二篇:新大纲如何备考
原标题:2020国家电网计算机类第二篇:新大纲如何备考 [山西中公国企]今天小编给大家带来2020国家电网计算机类第二篇:新大纲如何备考.山西中公国企(sxgqzp)微信公众号为您持续导航~ 根据对近 ...
- HTML基础之常用标签第二篇:有序无序标签,以及框架标签
上一篇聊了一些HTML中的一些基础标签,现在开始再聊HTML中的一些其它标签,比如有序无限标签,还有一些框架标签.表单标签涉及内容有点多,后面再来一篇. li <li> 标签定义列表项目. ...
- java设计模式中不属于创建型模式_23种设计模式第二篇:java工厂模式定义:工厂模式是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式...
23种设计模式第二篇:java工厂模式 定义: 工厂模式是 Java 中最常用的设计模式之一.这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 工厂模式主要是为创建对象提供过渡接口, ...
- 第二周:java异常和常用类 容器
一.java异常类 1.定义 异常就是在运行时产生的问题.通常用Exception描述. 在java中,把异常封装成了一个类,当出现问题时,就会创建异常类对象并抛出异常相关的信息(如详细信息,名称以及 ...
- Elasticsearch学习第二篇--常用的几种搜索方式
Elasticsearch学习第二篇--常用的几种搜索方式 一.Query String Search 查询全部 条件查询 二.Query DSL 查询全部 条件查询 三.Query Filter 四 ...
- 【JAVASE(7)】JAVASE学习--注解及小众常用类篇
A.注解--Annotation 一.概念: 注释:文字描述程序,给人看 注解:说明程序,给计算机看 1)从JDK5开始,Java增加对元数据的支持(MetaD ...
- Java基础-->一篇讲全Java常用类(详细易懂,建议收藏)
Java基础–>一篇讲全Java常用类(详细易懂,建议收藏) 文章目录 Java基础-->一篇讲全Java常用类(详细易懂,建议收藏) 1.字符串相关的类 String类 概述 创建Str ...
- 【java学习之路】(java SE篇)007.常用类
常用类 基本数据类型包装类 /*包装类和基本数据类型包装类是将基本数据类型封装成一个类,包含属性和方法使用:在使用过程中会涉及到自动装箱和自动拆箱装箱:将基本数据类型转换成包装类 intValue() ...
- 第二周预习:异常类,常用类,容器
异常类 异常 异常:在程序的运行过程中,发生了不正常的现象,阻止了程序的运行,我们称之为发生异常. Java使用throw关键字抛出一个Exception子类的实例表示异常发生. try-catch语 ...
最新文章
- SearchHit转成java对象_Java开发中最常犯的10个错误,你中招了吗?
- Miniconda3的环境配置
- 关于 Head First SQL 中文版
- hashmap 扩容是元素还是数组_曹工说JDK源码(1)--ConcurrentHashMap,扩容前大家同在一个哈希桶,为啥扩容后,你去新数组的高位,我只能去低位?...
- python浮点数保留两位小数_(RPA)学习——Python 保存两位小数
- C++11 regex库
- Hadoop3.0.3-SYNTH运行
- Python 二次开发 AutoCAD 简介
- 关于流媒体压缩的问题xvidcore的问题
- 世界第一行销之神杰 亚伯拉罕首次中国大陆行
- 华三OSPF多区域配置实例
- qlv格式转换成mp4 视频格式转换
- 大汉诡辩达人陆贾的公关策略cathy荷塘月色新浪博客
- H5后台读写CAD文件
- Unity 3D模型展示框架篇之自由观察(Cinemachine)
- javax.servlet-api 简介、中文文档、中英对照文档 下载
- 计算机二级操作题相关笔记
- 工具篇 之 iTerm 2 用户名修改(基于 iTerm 2 + oh-my-zsh)
- Web 安全工具篇:Burp Suite 使用指南
- 【STC单片机学习】第十三课:串口通信和RS485
热门文章
- Date、String、Calendar类型之间的转化
- nodejs 安装express
- linux下python 2.4升级到 python 2.5
- Android 2.2 带来全新拍照增强特性
- 还是觉得应该动手写点东西....
- 把这个写成一个类吧TREEVIEW
- 新手与大佬学习方式的差异
- Spring Boot第一个简单返回html页面的程序
- 苹果系统中国日历服务器,AppleMac苹果电脑最好用的中国农历日历(TinyCal)v1.11.0
- JAVA大厂高频面试题及答案