上文说到关于工作流运行时的一些基础。为了使用方便,我们定义一个使用单例和工厂模式的工作流运行时的工厂类。使用单例和工厂模式主要是创建对象的单一实例,因为一个应用程序域只能有一个WorkflowRuntime。
一、 创建一个WorkflowRuntime工厂类
在【2】中的创建的项目中添加一个类,文件名可为WorkflowFactory.cs。
添加引用:using System.Workflow.Runtime;
在类中添加如下代码:
private static WorkflowRuntime _workflowRuntime = null;
private static object _syncRoot = new object();
在后面添加如下方法:
public static WorkflowRuntime GetWorkflowRuntime()
{
lock(_synRoot)
{
if (null == _workflowRuntime)
_workflowRuntime = new WorkflowRuntime();
}
return _workflowRuntime;
}
lock 关键字将语句块标记为临界区,方法是获取给定对象的互斥锁,执行语句,然后释放该锁。
类名前加上public和static关键字。
添加workflow运行时的启动函数。
在_workflowRuntime = new WorkflowRuntime();后加上:
_workflowRuntime.StartRuntime();
实际上创建一workflow实例后,StartRuntime实际已被调用。但是我们在添加服务时,明确的调用它就有必要了,可增强代码的可维护性并确信运行时环境的状态已建立,这样任何人就都能使用workflow运行时对象。
停止workflow运行时
虽然有现成的StopRuntime方法,需要重新定义一个函数如下。
static void StopWorkflowRuntime(object sender, EventArgs e)
{
if (_workflowRuntime != null)
{
if (_workflowRuntime.IsStarted)
{
try
{
_workflowRuntime.StopRuntime();
}
catch (ObjectDisposedException)
{
}
}
}
}
现在我们有了一个workflow运行时的创建工厂。我们可以在主程序中调用它了。
二、在主程序中写工作流的事件处理程序
在program.cs中将WorkflowRuntimeworkflowRuntime = new WorkflowRuntime();改成:
WorkflowRuntimeworkflowRuntime = WorkflowFactory.GetWorkflowRuntime();
下表是运行时的一些事件的描述。
事件 | 功能 |
Started | 当 workflow 运行时启动后激发。 |
Stopped | 当 workflow 运行时停止后激发。 |
WorkflowCompleted | 当一个 workflow 实例完成后激发。 |
WorkflowIdled | 当一个 workflow 实例进入空闲状态时激发。当 workflow 实例进入了空闲状态后,你就有机会把 他们从内存中卸载掉、存储到数据库并可在稍后 的时间把它们加载进内存。 |
WorkflowTerminated | 当一个 workflow 实例被终止后激发。在宿主中调 用一个 workflow 实例的 Terminate 方法、或通过 一个 Terminate 活动、或当 workflow 运行时产生 一个未经捕获的异常时都会终止该 workflow。 |
接下来在主程序中添加上述事件的处理程序。为了看看这些事件的作用,还需要停止应用程序主线程一段时间。为此我们使用一个基于内核的自动重置事件。
在WorkflowRuntime workflowRuntime = WorkflowFactory.GetWorkflowRuntime();下添加如下代码:
workflowRuntime.WorkflowIdled += new EventHandler<WorkflowEventArgs>(workflowRuntime_WorkflowIdled);
workflowRuntime.WorkflowCompleted += new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_workflowCompleted);
workflowRuntime.WorkflowTerminated += new EventHandler<WorkflowTerminatedEventArgs>(workflowRuntime_workflowTerminated);
分别使用委托添加空闲、完成和中止的事件处理程序。
再添加如下代码:Console.WriteLine("对待 workflow 完成。");
waitHandle.WaitOne();
Console.WriteLine("完成.");
在Main方法前定义:
private static AutoResetEvent waitHandle = new AutoResetEvent(false);
完成上述三个事件的处理程序:
static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)
{
Console.WriteLine("Workflow空闲中");
}
static void workflowRuntime_WorkflowCompleted(object sender, WorkflowEventArgs e)
{
Console.WriteLine("workflow实例已完成");
waitHandle.Set();
}
static void workflowRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)
{
Console.WriteLine("workflow实例已终止,原因:'{0}'。", e.Exception.Message);
waitHandle.Set();
}
现在编译执行,因为还没有创建工作流实例,主程序一直是挂起状态。