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提供了一串的二进 ...
随机推荐
- PO_PO系列 - 收货管理分析(案例)
2014-07-01 Created By BaoXinjian
- POJ 3261 Milk Patterns (求可重叠的k次最长重复子串)+后缀数组模板
Milk Patterns Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 7586 Accepted: 3448 Cas ...
- CLR via C#笔记
第一部分 CLR基础 CLR和JIT “运行时”如何解析类型引用 第二部分 设计类型 使用C#的is和as操作符来转型 运行时的相互联系 基元类型.引用类型和值类型 值类型的装箱和拆箱 哈希码 dyn ...
- 转载__Android-屏幕适配需要注意的地方
1.尽量使用线性布局(LinearLayout)和相对布局(RelativeLayout),不要使用绝对布局. 2.尽量使用dip和sp,不要使用px. 3.为不同的分辨率提供不同的布局文件和图片. ...
- Uvision5不能进行软件仿真
Uvision5不能进行软件仿真不能进行软件仿真,报错: error 65: access violation at 0x40021000 : no 'read' permission(软件仿真出错) ...
- 如何利用svn自动同步更新到网站服务器
我们最终的目的是:当本地提交后,SVN服务器自动更新服务器端指定WEB目录内的文件 实现方法: 找到服务器端 SVN版本库所在的目录(目录名称是Repositories),这个目录是在安装Visual ...
- WebService 超简单入门教程(Java)
写在前面的话: 当两个人碰面后,产生了好感,如果需要得到双方的信息,那么双方的交流是必不可少的!应用程序也如此, 各个应用程序之间的交流就需要WebService来作为相互交流的桥梁! 项目目的: 程 ...
- Oracle安全漏洞2016.10报告
Oracle安全漏洞2016.10报告 http://www.cnvd.org.cn/webinfo/show/3950
- 一步步教你如何把电脑设置U盘启动(图解教程)
一.我们先来说说如何进入 BIOS设置程序: 在开机时按下特定的热键可以进入BIOS设置程序,不同类型的机器进入BIOS设置程序的按键不同,有的在屏幕上给出提示,有的不给出提示,几种常见的BIOS设置 ...
- Oracle中的约束
非空约束 NOT NULL 数据库表中的某一个列不能为空 唯一约束 UNIQUE 表中某一个列不允许重复 唯一约束所在列可以为NULL,但只能出现一次 代码: CREATE TABLE MEMBER ...