一起学WF3.5【3】

来源:互联网 发布:打开mpp的软件 编辑:程序博客网 时间:2024/05/21 20:15

上文说到关于工作流运行时的一些基础。为了使用方便,我们定义一个使用单例和工厂模式的工作流运行时的工厂类。使用单例和工厂模式主要是创建对象的单一实例,因为一个应用程序域只能有一个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);


添加命名空间:usingSystem.Threading;


完成上述三个事件的处理程序:

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();        }

现在编译执行,因为还没有创建工作流实例,主程序一直是挂起状态。





原创粉丝点击