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提供了一串的二进 ...
随机推荐
- Map的3种遍历[轉]
Map<String, String> map = new HashMap<String, String>(); map.put("A", "AA ...
- ylbtech-dbs-m-QQ邮箱
ylbtech-dbs:ylbtech-dbs-m-QQ邮箱 -- =============================================-- DatabaseName:QQ-Em ...
- 各式 Web 前端開發工具整理
程式碼編寫工具 (Coding Tools) 工作流程/建置/組合 (Workflow/Builds/Assemblers) lumbar brunch grunt lineman yeoman Ta ...
- 90、 Android UI模板设计
第一步:自定义xml属性 新建一个android项目,在values文件夹中新建一个atts.xml的文件,在这个xml文件中声明我们一会在使用自定义控件时候需要指明的属性.atts.xml < ...
- console,和自己定义事件
console.log这个指令是在浏览器控制台输出日志,用来调试程序 跟alert 类似 但不像alert那样会打断程序.
- java异常处理机制throws
throws可以在方法声明时抛出的异常.原则上throws声明的异常,一定要在该方法中抛出,否则没有意义. 相反的,若方法中我们主动通过throw抛出一个异常,应该在throws中声明该种类异常,通知 ...
- 查看sql server数据库文件信息
--drop table #dbfiles --deallocate cursor1 ------ declare cursor1 cursor for SELECT name from sys.da ...
- css margin-top设置html元素之间的距离
css margin-top属性设置的是一个元素的顶端与另一个元素之间的距离.这个距离称为上外边距,本文章向大家介绍css margin-top属性的用法和实例,需要的朋友可以参考一下. css ma ...
- Linux下串口ttyS2,ttyS3不能用的问题解决办法
PC104,Xlinux下,突然发现串口3,4不能用... 以为是硬件的问题,换成wince后,3,4工作正常,排除电路问题 在linux下查看dmesg: serial8250: ttyS0 at ...
- UIPickView 和 UIDatePicker
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...