一、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、基础示例

  新建一个工作流如下:

  WWF3常用类 &lt;第十一篇&gt;-LMLPHP

  其代码如下:

    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、服务

  首先创建一个工作流程序如下:

  WWF3常用类 &lt;第十一篇&gt;-LMLPHP

  代码如下:

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

  新建一个工作流如下:

  WWF3常用类 &lt;第十一篇&gt;-LMLPHP

  代码如下:

    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(); //恢复工作流运行
}
}
04-16 16:30