您的位置:首页 > 其它

Windows Workflow Foundation(3)- WorkflowRuntime及其相关事件

2008-12-24 16:03 423 查看

工作流分类

工作流分为顺序工作流(Sequential)和状态机工作流(State Machine)。顺序工作流是以顺序驱动并按顺序执行一组包含的活动。您可以向顺序工作流添加单个活动,也可以添加其他复合活动以实现并行(ParallelActivity)、事件驱动并行活动(EventHandlingScopeActivity)、数据驱动执行 (ConditionedActivityGroup)、事件驱动分支 (ListenActivity) 和熟悉的强制性控制流模式,如条件分支 (IfElseActivity) 和迭代(WhileActivityReplicatorActivity),还可以添加自定义复合活动,用这些活动实现您的解决方案需要的特定控制流模式。

下面的流程图显示一个顺序工作流的示例。



顺序工作流按顺序方式执行活动,直到最后一个活动完成。即使在正常操作下,顺序工作流也不必是完全确定的。例如,您可以使用 ListenActivity 活动或 ParallelActivity 活动,在这两种情况下事件的准确顺序可以不同。状态机工作流是以事件驱动的活动,工作流本身由一组状态组成。将一个状态指示为初始状态。每个状态都可以接收一组特定事件。视事件而定,可以转换到另一个状态。状态机工作流可以有最终状态。当对最终状态进行转换时,工作流将完成。

下面的流程图是一个状态机工作流的示例。



下表列出了 Windows Workflow Foundation 基本活动库中状态机相关的活动。

活动

说明

EventDrivenActivity

用于依赖于外部事件开始执行的状态。EventDrivenActivity 活动必须具有实现 IEventActivity 接口作为第一个子活动的活动。

SetStateActivity

指定到新状态的转换。

StateActivity

表示状态机中的一个状态;可能包含其他 State 活动。有关更多信息。

StateInitializationActivity

在进入某个状态时执行;可能包含其他活动。有关更多信息

StateFinalizationActivity

在离开 StateActivity 活动时执行包含的活动。有关更多信息

WorkflowRuntime

当我们在WF环境中执行任务时,需要一些东西来监管执行的过程,这个东西就是命名为“WorkflowRuntime”的对象。 WorkflowRuntime 启动一个独立的工作流任务。在我们的任务执行过程中,WorkflowRuntime 也会针对不同的情况响应对应的事件。并 且,WorkflowRuntime还能在你的执行环境中增加一个附加的服务来保持跟踪。

WF 架构纵览见下图:



WF 和我们的应用程序并行执行。其实,我们需要应用程序作为宿主。宿主应用程序可以是Windows Forms 应用程序,控制台应用程序,ASP.NET WEB 应用程序,甚至可以是一个Windows Server。WF 运行时和我们的应用程序同在一个.NET 应用程序域执行,每个应用程序域只有一个唯一的WorkflowRuntime 实例,试图在一个 应用程序域中建立第二个WorkflowRuntime 的实例的话,其结果就是抛出一个“InvalidOperationException”异常。

workflow 应用程序-“workflows”-意思指创建的逻辑上的一组活动。这些逻辑上的活动用来完成你需要的工作流任务。当你宿主workflow 运行时的时候,其实我们就在操作工作流中的活动并让workflow 运行时执行他们。其结果就是生成一个workflow 实例,workflow实例是一个当前正执行 的workflow 任务,它能自己完成逻辑上的一组活动。

WorkflowRuntime相关事件

事件

功能

Started

当workflow 运行时启动后激发。

Stopped

当workflow 运行时停止后激发。

WorkflowCompleted

当一个workflow 实例完成后激发。

WorkflowIdled

当一个workflow 实例进入空闲状态时激发。当workflow 实例进入了空闲状态后,你就有机会把他们从内存中卸载掉、存储到数据库并可在稍后的时间把它们加载进内存。

WorkflowTerminated

当一个workflow 实例被终止后激发。在宿主中调用一个workflow 实例的Terminate 方法、或通过一个Terminate 活动、或当workflow 运行时产生一个未经捕获的异常时都会终止该workflow。

为了更直观的理解各种事件的执行状况,我们用应用程序来展示。我们在第一章的工程里面的workflow里添加一个的Delay活动和一个WorkflowFactory.cs文件。





WorkflowFactory.cs文件代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Workflow.Runtime;

namespace WorkflowConsoleApplication1

{

class WorkflowFactory

{

// Singleton instance of the workflow runtime

private static WorkflowRuntime _workflowRuntime = null;

// Lock (sync) object

private static object _syncRoot = new object();

// Factory method

public static WorkflowRuntime GetWorkflowRuntime()

{

// Lock execution thread in case of multi-threaded

// (concurrent) access.

lock (_syncRoot)

{

// Check for startup condition

if (null == _workflowRuntime)

{

// Provide for shutdown

AppDomain.CurrentDomain.ProcessExit += new EventHandler(StopWorkflowRuntime);

AppDomain.CurrentDomain.DomainUnload += new EventHandler(StopWorkflowRuntime);

// Not started, so create instance

_workflowRuntime = new WorkflowRuntime();

// Start the runtime

_workflowRuntime.StartRuntime();

} // if

// Return singleton instance

return _workflowRuntime;

} // lock

}

// Shutdown method

static void StopWorkflowRuntime(object sender, EventArgs e)

{

if (_workflowRuntime != null)

{

if (_workflowRuntime.IsStarted)

{

try

{

// Stop the runtime

_workflowRuntime.StopRuntime();

}

catch (ObjectDisposedException)

{

// Already disposed of, so ignore...

} // catch

} // if

} // if

}

}

}

Program.cs 文件代码

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading;

using System.Workflow.Runtime;

using System.Workflow.Runtime.Hosting;

namespace WorkflowConsoleApplication1

{

class Program

{

private static AutoResetEvent waitHandle = new AutoResetEvent(false);

static void Main(string[] args)

{

//实例化WorkflowRuntime即工作流引擎

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

//工作流实例化

WorkflowInstance instance = workflowRuntime.CreateWorkflow(typeof(WorkflowConsoleApplication1.Workflow1));

Console.WriteLine("Waiting for workflow completion.");

//启动工作流

instance.Start();

waitHandle.WaitOne();

Console.WriteLine("Done.");

System.Threading.Thread.Sleep(10000);

}

static void workflowRuntime_WorkflowTerminated(object sender, WorkflowTerminatedEventArgs e)

{

Console.WriteLine("Workflow instance terminated, reason: '{0}'.", e.Exception.Message);

waitHandle.Set();

}

static void workflowRuntime_WorkflowCompleted(object sender, WorkflowCompletedEventArgs e)

{

Console.WriteLine("Workflow instance completed.");

waitHandle.Set();

}

static void workflowRuntime_WorkflowIdled(object sender, WorkflowEventArgs e)

{

Console.WriteLine("Workflow instance idled.");

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: