Windows Workflow Foundation(3)- WorkflowRuntime及其相关事件
2008-12-24 16:03
423 查看
工作流分类
工作流分为顺序工作流(Sequential)和状态机工作流(State Machine)。顺序工作流是以顺序驱动并按顺序执行一组包含的活动。您可以向顺序工作流添加单个活动,也可以添加其他复合活动以实现并行(ParallelActivity)、事件驱动并行活动(EventHandlingScopeActivity)、数据驱动执行 (ConditionedActivityGroup)、事件驱动分支 (ListenActivity) 和熟悉的强制性控制流模式,如条件分支 (IfElseActivity) 和迭代(WhileActivity、ReplicatorActivity),还可以添加自定义复合活动,用这些活动实现您的解决方案需要的特定控制流模式。下面的流程图显示一个顺序工作流的示例。
顺序工作流按顺序方式执行活动,直到最后一个活动完成。即使在正常操作下,顺序工作流也不必是完全确定的。例如,您可以使用 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。 |
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.");
}
}
}
相关文章推荐
- 跟我一起学Windows Workflow Foundation(3)-----使用If/Else活动,定制活动处理工作流,使用事件传递数据
- 跟我一起学Windows Workflow Foundation(3)-----使用If/Else活动,定制活动处理工作流,使用事件传递数据
- 跟我一起学Windows Workflow Foundation(3)-----使用If/Else活动,定制活动处理工作流,使用事件传递数据
- windows workflow foundation相关资源
- Windows Workflow Foundation - [介绍及相关资源]
- Windows Workflow Foundation (wwf) 学习笔记(一)
- 和我一起学Windows Workflow Foundation(1)-----创建和调试一个WF实例
- 和我一起学Windows Workflow Foundation(2)-----让WF通过参数接收数据
- 书讯 -- Microsoft Windows Workflow Foundation Step by Step
- Presenting Windows Workflow Foundation
- 安装Microsoft Visual Studio 2005 Extensions for Windows Workflow Foundation的工具箱控件丢失问题解决~~
- 现在可用:Workflow Foundation Activity Pack for Windows Azure CTP 1
- WWF(Windows Workflow Foundation)开发环境的建立
- 我们为什么需要Windows Workflow Foundation?(摘)
- Essential Windows Workflow Foundation(Windows 开发流程基础
- 使用windows workflow foundation 并发布为webservice
- 注册Windows service及其相关
- [搬家帖]在VS2005中配置Windows Workflow Foundation
- Windows Workflow Foundation is coming...
- Windows Workflow Foundation Web Workflow Approvals Starter Kit(转)