一、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();
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());
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();
//多次卸载工作流
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() > )
{
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. servlet类第二篇

    1servlet的生命周期是什么? 服务器启动时(web.xml中配置load-on-startup=1,默认为0)或者第一次请求该servlet时,就会初始化一个Servlet对象,也就是会执行初始 ...

  2. Java中常用的七个阻塞队列第二篇DelayQueue源码介绍

    Java中常用的七个阻塞队列第二篇DelayQueue源码介绍 通过前面两篇文章,我们对队列有了了解及已经认识了常用阻塞队列中的三个了.本篇我们继续介绍剩下的几个队列. 本文主要内容:通过源码学习De ...

  3. [转]Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇--开发工具库篇,主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容.多 ...

  4. Android开源项目第二篇——工具库篇

    本文为那些不错的Android开源项目第二篇——开发工具库篇,**主要介绍常用的开发库,包括依赖注入框架.图片缓存.网络相关.数据库ORM建模.Android公共库.Android 高版本向低版本兼容 ...

  5. 深入理解Java常用类-----StringBuilder

    上篇文章我们介绍过String这个常用类,知道了该类的内部其实是用的一个char数组表示一个字符串对象的,只是该字符数组被final修饰,一旦初始化就不能修改,但是对于经常做字符串修改操作的情况下,S ...

  6. 第二篇 界面开发 (Android学习笔记)

    第二篇 界面开发 第5章 探索界面UI元素 ●The Android View Class     ●△Widget设计步骤 需要修改三个XML,以及一个class: 1)第一个xml是布局XML文件 ...

  7. Spring Cloud第二篇 | 使用并认识Eureka注册中心

    ​ 本文是Spring Cloud专栏的第二篇文章,了解前一篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 ​​ 一.Sprin ...

  8. 图解Python 【第六篇】:面向对象-类-进阶篇

    由于类的内容比较多,分为类-初级基础篇和类-进阶篇 本节内容一览图: 一.类成员修饰符 每一个类的成员都有两种形式: 公有成员,在任何地方都能访问 私有成员,只能在类的内部才能访问 1.1.私有成员和 ...

  9. 第二篇.1、python基础之数据类型与变量

    一.变量 1 什么是变量之声明变量 #变量名=变量值 age=18 gender1='male' gender2='female' 2 为什么要有变量 变量作用:“变”=>变化,“量”=> ...

随机推荐

  1. Java方法总结与源码解析(未完待续)

    使用StringTokenizer去掉字符串中的空格 public class StringTo { public static void main(String[] args){ String te ...

  2. adb 工具学习

    adb (android debug bridge)简单介绍: 1.adb 是 Android SDK中所带工具.使用adb,可以在PC上操作Android设备或者模拟器 2.主要功能有: 将本地ap ...

  3. Web Uploader文件上传&&使用webupload有感(黄色部分)

    引入资源 使用Web Uploader文件上传需要引入三种资源:JS, CSS, SWF. <!--引入CSS--> <link rel="stylesheet" ...

  4. Linux重置mysql密码(转载)

    From:http://hi.baidu.com/mcspring/item/6358ee27afe7e1c8a5275ab7 首先,必须拥有MySQL操作的所有权限: 其次,停止MySQL服务: / ...

  5. CentOS修改163源(转载)

    From:http://www.linuxidc.com/Linux/2012-08/69043.htm #CentOS-Base.repo其他版本文件在http://mirrors.163.com/ ...

  6. 用block响应button的点击事件

    1.继承UIButton : 2.在自己定义的button类中的方法 addTarget:(id)target action:(SEL)action forControlEvents:(UIContr ...

  7. Python深入04 闭包

    作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 闭包(closure)是函数式编程的重要的语法结构.函数式编程是一种编程范式 (而 ...

  8. 各式 Web 前端開發工具整理

    程式碼編寫工具 (Coding Tools) 工作流程/建置/組合 (Workflow/Builds/Assemblers) lumbar brunch grunt lineman yeoman Ta ...

  9. notepad++查看aspx

    源地址:http://www.cnblogs.com/qingliuyu/archive/2012/03/12/2392633.html 对于.net项目,微软设计了很多独有的扩展名,如.aspx, ...

  10. C++学习13 类class和结构体struct的区别

    C++保留了C语言的 struct,并且加以扩充.在C语言中,struct 只能包含数据成员,不能包含成员函数.而在C++中,struct 类似于 class,既可以包含数据成员,又可以包含成员函数. ...