一、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常用类 <第十一篇>的更多相关文章

  1. Python开发【第二十一篇】:Web框架之Django【基础】

    Python开发[第二十一篇]:Web框架之Django[基础]   猛击这里:http://www.cnblogs.com/wupeiqi/articles/5237704.html Python之 ...

  2. Spring Cloud第十一篇 | 分布式配置中心高可用

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

  3. 解剖SQLSERVER 第十一篇 对SQLSERVER的多个版本进行自动化测试(译)

    解剖SQLSERVER 第十一篇    对SQLSERVER的多个版本进行自动化测试(译) http://improve.dk/automated-testing-of-orcamdf-against ...

  4. 第十一篇 SQL Server安全审核

    本篇文章是SQL Server安全系列的第十一篇,详细内容请参考原文. SQL Server审核SQL Server审核是指你可以在数据库或服务器实例监控事件.审核日志包含你选择捕获的事件的列表,在服 ...

  5. Winform常用开发模式第一篇

    Winform常用开发模式第一篇 上一篇博客最后我提到“异步编程模型”(APM),之后本来打算整理一下这方面的材料然后总结一下写篇文章与诸位分享,后来在整理的过程中不断的延伸不断地扩展,发现完全偏离了 ...

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

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

  7. Java常用类之String类、Stringbuffer和Random类练习

    定义一个StringBuffer类对象, 1)使用append方法向对象中添加26个字母,并倒序遍历输入 2)删除前五个字符 package 第十一章常用类; /** * 定义一个StringBuff ...

  8. 【译】第十一篇 SQL Server安全审核

    本篇文章是SQL Server安全系列的第十一篇,详细内容请参考原文. SQL Server审核SQL Server审核是指你可以在数据库或服务器实例监控事件.审核日志包含你选择捕获的事件的列表,在服 ...

  9. Qt 中一些常用类中文说明

    Qt 中一些常用类中文说明是本文讲述的内容,这篇文章主要是介绍Qt 当中经常使用的类,采取的是使用字母索引的方式,下面的类是被经常使用的. QDataStream 为QIODevice提供了一串的二进 ...

随机推荐

  1. Builder模式(建造者模式)

    在设计模式中对Builder模式的定义是用于构建复杂对象的一种模式,所构建的对象往往需要多步初始化或赋值才能完成.那么,在实际的开发过程中,我们哪些地方适合用到Builder模式呢?其中使用Build ...

  2. Spark参数配置说明

    1  修改$SPARK_HOME/conf目录下的spark-defaults.conf文件 添加以下配置项 spark.sql.hive.convertMetastoreParquet       ...

  3. IREP_SOA Integration WSDL概述(概念)

    20150827 Created By BaoXinjian

  4. mysql 实现oracle start with connect by递归

    在Oracle 中我们知道有一个 Hierarchical Queries 通过CONNECT BY 我们可以方便的查了所有当前节点下的所有子节点.但很遗憾,在MySQL的目前版本中还没有对应的功能. ...

  5. ruby中将数组转换成hash

    class Arraydef to_h(default=nil)Hash[ *inject([]) { |a, value| a.push value, default || yield(value) ...

  6. 无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(二)

    上一篇文章 "无侵入方面编程-用HttpModule+SoapExtension监视页面执行参数(一)"中,我们实现了监视每个页面的执行情况和调用WebService的简单信息. ...

  7. 使用spool导出数据

    源地址:http://wallimn.iteye.com/blog/472182 set trimspool on set echo off set feedback off set pagesize ...

  8. Servlet中的请求转发和重定向

    跳转和重定向 有的时候客户端请求到达服务端后需要对请求重新转发到其它Servlet甚至别的服务器,这就需要跳转和重定向. 区别 一般来说,跳转是服务器内部跳转,例如将请求从一个Servlet转发给另外 ...

  9. Java 线程间通讯(管道流方式)

    一.管道流是JAVA中线程通讯的常用方式之一,基本流程如下: 1)创建管道输出流PipedOutputStream pos和管道输入流PipedInputStream pis 2)将pos和pis匹配 ...

  10. 浅谈 Linux 内核开发之网络设备驱动

    转自http://www.ibm.com/developerworks/cn/linux/l-cn-networkdriver/ 网络设备介绍 网络设备是计算机体系结构中必不可少的一部分,处理器如果想 ...