WWF3常用类 <第十一篇>
一、WorkflowRuntime类
System.Workflow.Runtime.WorkflowRuntime是工作流的运行引擎。WorkflowRuntime在宿主中以自己独立的线程运行,它可以装在多个工作流实例,每个工作流实例在WorkflowRuntime有独立的线程。同一宿主可以实例化多个引擎,并且可以同时运行。
| 名称 | 说明 |
|---|---|
| AddService | 将指定的服务添加到工作流运行时引擎(WorkflowRuntime)中。 |
| CreateWorkflow(Type) | 使用指定工作流创建新的工作流实例,有多个重载。 |
| Dispose | 释放由 WorkflowRuntime 占用的资源。 |
| GetAllServices(Type) | 检索实现或派生自指定的 Type 且添加到工作流运行时引擎的所有服务。 |
| GetAllServices<T>() | 检索实现或派生自指定的泛型类型且添加到工作流运行时引擎的所有服务。 |
| GetLoadedWorkflows | 获取一个集合,该集合包含当前加载到内存的所有工作流实例。 |
| GetService(Type) | 从工作流运行时引擎中检索指定的 Type 的服务。 |
| GetService<T>() | 从工作流运行时引擎中检索指定泛型类型的服务。 |
| GetWorkflow | 检索具有指定 Guid 的工作流实例。 |
| RemoveService | 从工作流运行时引擎中移除指定的服务。 |
| StartRuntime | 启动工作流运行时引擎和工作流运行时引擎服务。 |
| StopRuntime | 停止工作流运行时引擎和运行时服务。 |
1、基础示例
新建一个工作流如下:

其代码如下:
public sealed partial class Workflow1 : SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
} private void ExecuteCode1(object sender, EventArgs e)
{
MessageBox.Show("工作流已开始运行!");
} private void ExecuteCode2(object sender, EventArgs e)
{
MessageBox.Show("会不会运行到我?");
}
}
新建一个Winform两个按钮,代码如下:
public partial class Form1 : Form
{
//定义工作流运行时引擎
WorkflowRuntime workflowRuntime = new WorkflowRuntime(); public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
//启动工作流运行时引擎
workflowRuntime.StartRuntime();
//用Type创建指定的工作流实例
WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1));
//启动该工作流实例
workflowInstance.Start();
} private void button2_Click(object sender, EventArgs e)
{
//获取该隐形上运行着的所有工作流
ReadOnlyCollection<WorkflowInstance> ListWorkflowInstance = workflowRuntime.GetLoadedWorkflows();
Guid guid = new Guid();
string NameStr = "";
foreach (WorkflowInstance item in ListWorkflowInstance)
{
NameStr += item.InstanceId + ";";
guid = item.InstanceId;
}
MessageBox.Show("此引擎上运行的所有工作流实例InstanceId" + NameStr);
//用Guid检索工作流
WorkflowInstance workflowInstance = workflowRuntime.GetWorkflow(guid);
MessageBox.Show("使用Guid检索出的工作流的类型为:" + workflowInstance.GetWorkflowDefinition().GetType().Name);
//停止工作流引擎并释放资源,这样一来Code2不会执行
workflowRuntime.StopRuntime();
workflowRuntime.Dispose();
}
}
WorkflowRuntime的服务比较多,例如,工作流持续化服务,工作流跟踪服务,在外部程序通过事件调用工作流等都属于服务。
2、服务
首先创建一个工作流程序如下:

代码如下:
namespace WorkflowLibrary1
{
[ExternalDataExchange]
public interface IEvent
{
event EventHandler<ExternalDataEventArgs> MyEvent1;
} public sealed partial class Workflow1 : SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
} private void Call(object sender, ExternalDataEventArgs e)
{
MessageBox.Show("此方法被外部调用!");
}
}
}
新建一个Winform程序,只有一个按钮,代码如下:
public partial class Form1 : Form, WorkflowLibrary1.IEvent
{
//定义工作流运行时引擎
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
public event EventHandler<ExternalDataEventArgs> MyEvent1;
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
//启动工作流运行时引擎
workflowRuntime.StartRuntime();
//用Type创建指定的工作流实例
WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1));
workflowInstance.Start();
//创建服务
ExternalDataExchangeService externalService = new ExternalDataExchangeService();
//添加服务到工作流引擎
workflowRuntime.AddService(externalService);
externalService.AddService(this); //启动该工作流实例
ExternalDataEventArgs guid = new ExternalDataEventArgs(workflowInstance.InstanceId);
MyEvent1(null, guid); object o = workflowRuntime.GetService(typeof(ExternalDataExchangeService));
MessageBox.Show(o.ToString()); ExternalDataExchangeService EDS = workflowRuntime.GetService<ExternalDataExchangeService>();
MessageBox.Show(EDS.ToString()); //获取某类型的服务集合,object数组
ReadOnlyCollection<object> ListObject = workflowRuntime.GetAllServices(typeof(ExternalDataExchangeService));
MessageBox.Show("共有ExternalDataExchangeService类型数量为:" + ListObject.Count.ToString()); //1 //移除序号为0的服务
workflowRuntime.RemoveService(ListObject[]); //是GetAllServices(Type)的泛型版
ReadOnlyCollection<ExternalDataExchangeService> ListExternalDataExchangeService = workflowRuntime.GetAllServices<ExternalDataExchangeService>();
MessageBox.Show("共有ExternalDataExchangeService类型数量为:" + ListExternalDataExchangeService.Count.ToString()); //
}
}
http://msdn.microsoft.com/zh-cn/library/ms611709.aspx
二、WorkflowInstance类
WorkflowInstance是指工作流引擎中运行的工作流实例,通常由工作流引擎创建。
1、属性
| 名称 | 说明 |
|---|---|
| InstanceId | 获取工作流实例的唯一标识符。 |
| WorkflowRuntime | 获取此工作流实例的 WorkflowRuntime。 |
2、方法
| 名称 | 说明 |
|---|---|
| Abort | 中止工作流实例。 |
| ApplyWorkflowChanges | 将更改应用到 WorkflowChanges 对象所指定的工作流实例。 |
| EnqueueItem | 将消息同步发送到指定工作流队列。 |
| EnqueueItemOnIdle | 当工作流处于空闲状态时,将消息发送到指定的工作流队列。 在确认工作流计划程序处于空闲状态(即没有执行任何有效操作)之后,EnqueueItemOnIdle 将一直等待,直至工作流达到空闲点并编排队列。 |
| GetWorkflowDefinition | 检索此工作流实例的根活动。 |
| GetWorkflowNextTimerExpiration | 返回下一个时间点,已计划在此时间点向此 WorkflowInstance 传递计时器消息。 |
| GetWorkflowQueueData | 获取 WorkflowQueueInfo 对象的集合,该集合包含与此工作流实例关联的工作流队列的挂起项和订阅活动。 |
| Load | 加载先前卸载的工作流实例。 |
| ReloadTrackingProfiles | 重新加载此工作流实例的跟踪配置文件。 |
| Resume | 继续执行先前挂起的工作流实例。 |
| Start | 开始执行工作流实例。 |
| Suspend | 挂起工作流实例。 |
| Terminate | 以同步方式终止工作流实例。 |
| TryUnload | 当实例处于挂起或空闲状态时,将工作流实例从内存卸载到持久性存储区。 |
| Unload | 将工作流实例从内存卸载到持久性存储区。 此调用将进行阻止,直至当前计划的工作完成或事务范围结束。 |
http://msdn.microsoft.com/zh-cn/library/system.workflow.runtime.workflowinstance(v=vs.110).aspx
新建一个工作流如下:

代码如下:
public sealed partial class Workflow1 : SequentialWorkflowActivity
{
public Workflow1()
{
InitializeComponent();
} private void Code1(object sender, EventArgs e)
{
MessageBox.Show("Code1正在被执行!");
} private void Code2(object sender, EventArgs e)
{
MessageBox.Show("Code2正在被执行!");
}
}
新建一个仅仅一个按钮的WinForm程序,代码如下:
public partial class Form1 : Form
{
//定义工作流运行时引擎
WorkflowRuntime workflowRuntime = new WorkflowRuntime();
public Form1()
{
InitializeComponent();
} private void button1_Click(object sender, EventArgs e)
{
//启动工作流运行时引擎
workflowRuntime.StartRuntime();
//用Type创建指定的工作流实例
WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1));
workflowInstance.Start(); Activity act = workflowInstance.GetWorkflowDefinition(); //获取跟活动
MessageBox.Show(act.Name); //Workflow1
workflowInstance.Suspend("挂起"); //挂起工作流 ReadOnlyCollection<WorkflowQueueInfo> ListQueue = workflowInstance.GetWorkflowQueueData(); //挂起的和订阅的活动
MessageBox.Show(ListQueue.Count.ToString()); //workflowInstance.Unload(); //挂起的工作流能够移出内存(卸载)需要配合持久化功能使用
//workflowInstance.Load(); //卸载后再装载 workflowInstance.Resume(); //恢复工作流运行
}
}
WWF3常用类 <第十一篇>的更多相关文章
- Python开发【第二十一篇】:Web框架之Django【基础】
Python开发[第二十一篇]:Web框架之Django[基础] 猛击这里:http://www.cnblogs.com/wupeiqi/articles/5237704.html Python之 ...
- Spring Cloud第十一篇 | 分布式配置中心高可用
本文是Spring Cloud专栏的第十一篇文章,了解前十篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring Cl ...
- 解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)
解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译) http://improve.dk/automated-testing-of-orcamdf-against ...
- 第十一篇 SQL Server安全审核
本篇文章是SQL Server安全系列的第十一篇,详细内容请参考原文. SQL Server审核SQL Server审核是指你可以在数据库或服务器实例监控事件.审核日志包含你选择捕获的事件的列表,在服 ...
- Winform常用开发模式第一篇
Winform常用开发模式第一篇 上一篇博客最后我提到“异步编程模型”(APM),之后本来打算整理一下这方面的材料然后总结一下写篇文章与诸位分享,后来在整理的过程中不断的延伸不断地扩展,发现完全偏离了 ...
- 深入理解Java常用类-----StringBuilder
上篇文章我们介绍过String这个常用类,知道了该类的内部其实是用的一个char数组表示一个字符串对象的,只是该字符数组被final修饰,一旦初始化就不能修改,但是对于经常做字符串修改操作的情况下,S ...
- Java常用类之String类、Stringbuffer和Random类练习
定义一个StringBuffer类对象, 1)使用append方法向对象中添加26个字母,并倒序遍历输入 2)删除前五个字符 package 第十一章常用类; /** * 定义一个StringBuff ...
- 【译】第十一篇 SQL Server安全审核
本篇文章是SQL Server安全系列的第十一篇,详细内容请参考原文. SQL Server审核SQL Server审核是指你可以在数据库或服务器实例监控事件.审核日志包含你选择捕获的事件的列表,在服 ...
- Qt 中一些常用类中文说明
Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进 ...
随机推荐
- 单点登录filter根据redis中的key判断是否退出
package com.ailk.biapp.ci.localization.cntv.filter; import java.io.IOException; import java.util.Has ...
- php中at @符号的作用使用说明
一次,下载别人的源码来看,看到无数@记号,开始以为是注释:后来发现@后面的语句也是会执行的.纳闷了,这个记号究竟是做什么的呢..... 随着学习的不断深入,总算是明白了.这个记号的作用有点类似于asp ...
- iOS 批量打包--Shell脚本
由于公司有批量打包的需要,只是渠道号不一样,网上搜索一番,大致有两个方式:a) 从源程序一次性打出所有渠道的ipa包,大概的思路就是利用脚本循环执行打包过程,而每次打包前都通过脚本修改项目中存放渠道号 ...
- SqlCommand.ExecuteNonQuery()执行查询返回值的问题
SqlCommand.ExecuteNonQuery 方法对连接执行 Transact-SQL 语句并返回受影响的行数.但是有个前提:必须是 UPDATE.INSERT 和 DELETE 语句.而对于 ...
- 106、抗锯齿方法paint.setAntiAlias(ture);paint.setFilterBitmap(true))
在Android中,目前,我知道有两种出现锯齿的情况. ① 当我们用Canvas绘制位图的时候,如果对位图进行了选择,则位图会出现锯齿. ② 在用View的RotateAnimation做动画时候 ...
- 通过批处理(bat)命令创建mysql数据库及用户等
1.建立数据库文件:mysqlCreatDB.sql create database Mydb 2.为用户赋予权限文件:grantUser.sql grant select,insert,update ...
- OpenGL ES 着色语言
OpenGL 着色器中使用的是着色语言GLSL.着色语言源自C语言,提供了丰富的原生类型,如向量.矩阵等,还有大量的内建函数,这在处理3D图形时可以更加高效.易用.下面是整理的是OpenGL ES2. ...
- C++ DLL中导出函数的声明的方法
定义: TESTDLLEXPORT_API int fnTestDllExport(void); TESTDLLEXPORT_API int fnTestCall(void); TESTDLLEXPO ...
- Java是传值还是传引用
http://www.bccn.net/Article/kfyy/java/jszl/200601/3069.html 对于基本数据类型(整型.浮点型.字符型.布尔型等),传值;对于引用类型(对象.数 ...
- js定时器、高亮修改单元格背景色
window.setInterval() 功能:按照指定的周期(以毫秒计)来调用函数或计算表达式. 语法:setInterval(code,millisec) 解释:code:在定时时间到时要执行的J ...