代码改变世界

WF笔记 – Workflow概念

2008-04-22 11:46  Animax!  阅读(663)  评论(0编辑  收藏  举报

工作流是一组存储为模型的名为活动的基本单元,活动用于描述实际进程。工作流提供了一种方法,用于描述多项短期运行或长期运行的工作之间的执行顺序和依赖关系。此工作从头到尾地贯穿模型,并且活动可以人工执行或由系统功能执行。

工作流运行时引擎:

每个正在运行的工作流实例都是由进程中运行时引擎创建和维护的,该引擎通常称为“工作流运行时引擎”。 在一个应用程序域中可以有多个工作流运行时引擎,并且运行时引擎的每个实例均可支持多个并发运行的工作流实例。

工作流模型经过编译后,可以在包括控制台应用程序、基于窗体的应用程序、Windows 服务、ASP.NET 网站和 Web 服务在内的任意 Windows 进程中执行。 由于工作流是在进程中承载,因此工作流可以轻松地与其宿主应用程序通信。

下面的插图显示了如何在一个宿主应用程序的进程中同时承载工作流、活动和工作流运行时引擎。

 

[ms-help://MS.MSDNQTR.v90.chs/wf_gettingstarted/html/488a45f0-2201-4986-bfe2-17ba5c92e924.htm]

 

工作流创作样式:

Windows Workflow Foundation 支持多种工作流创作样式,如顺序、状态机和数据驱动。 顺序样式非常简单,对于总是相同的重复、可预测操作很有用。 状态机工作流样式包含一组事件驱动状态。 数据驱动样式依赖数据来确定是否基于本地数据状态来运行某些活动。

顺序工作:顺序工作流样式按逐个顺序执行一组包含的活动。您可以向顺序工作流添加其他复合活动以实现并行 (ParallelActivity)、事件驱动并行 (EventHandlingScopeActivity)、数据驱动执行 (ConditionedActivityGroup)、事件驱动分支 (ListenActivity) 和熟悉的强制性控制流模式,如条件分支 (IfElseActivity) 和迭代(WhileActivityReplicatorActivity)。您也可以利用 Windows Workflow Foundation 的扩展性编写自定义复合活动,用这些活动实现您的解决方案需要的特定控制流模式。

顺序工作流按顺序方式执行活动,直到最后一个活动完成。即使在正常操作下,顺序工作流也不必是完全确定的。例如,您可以使用 ListenActivity 活动或 ParallelActivity 活动,在这两种情况下事件的准确顺序可以不同。

状态机工作流:在工作流创作的状态机样式中,作者[MSDN]将工作流建模为状态机。工作流本身由一组状态组成。将一个状态指示为初始状态。每个状态都可以接收一组特定事件。视事件而定,可以转换到另一个状态。状态机工作流可以有最终状态。当对最终状态进行转换时,工作流将完成。
Windows Workflow Foundation 基本活动库中状态机相关的活动:

EventDrivenActivity  用于依赖于外部事件开始执行的状态。

SetStateActivity  指定到新状态的转换。

StateActivity  表示状态机中的一个状态;可能包含其他 State 活动。

StateInitializationActivity  在进入某个状态时执行;可能包含其他活动。

StateFinalizationActivity  在离开 StateActivity 活动时执行包含的活动。

[ms-help://MS.MSDNQTR.v90.chs/wf_gettingstarted/html/aacf4ec6-da05-4974-958a-974769dda739.htm]

工作流创作模式:

Windows Workflow Foundation 默认将工作流定义与业务逻辑相分离。 在典型的工作流创作方案中,工作流创建者可以使用设计器来指定工作流定义,然后使用 C# 或 Visual Basic 代码来表示业务逻辑。 这种创作模式称为“代码分离”。

Windows Workflow Foundation 支持以下针对工作流实现的创作模式:

仅限代码。这是 Windows Workflow Foundation 的默认创作模式。在该模式下,可以使用 C# Visual Basic 代码来指定使用 Windows Workflow Foundation API 集的工作流。在仅限代码的工作流中,工作流定义使用 C# Visual Basic 代码来声明工作流结构。仅限代码的工作流必须进行编译。

代码分离。在此模式下,可以通过使用工作流标记并将其与 C# Visual Basic 代码隐藏实现进行组合来定义工作流,这与 ASP.NET 模型类似。与无代码创作模式不同,代码分离的工作流必须进行编译,并且无法直接加载到工作流运行时引擎。

无代码。在此模式下,可以通过使用工作流标记来创作工作流。然后可以使用 Windows Workflow Foundation 命令行工作流编译器来编译工作流,也可以通过宿主应用程序将工作流标记文件加载到工作流运行时引擎。

[ms-help://MS.MSDNQTR.v90.chs/wf_gettingstarted/html/4a1401d8-177c-48b9-9008-5b2c980a774d.htm]

 

创建简单工作流(Demo):

首先在VS IDE中创建一个顺序工作流控制台应用程序的项目。IDE会为项目生成两份文件,控制台程序Program.csWF状态机服务的文件Workflow1.cs

这时我们能看见在Program.cs文件中,IDE已经为我们创建了运行工作流的代码。然后再查看Workflow1.cs文件的代码,在代码中加入一个公开的属性:

public bool IsFixed { get; set; }

这个属性是用于给之后添加的while提供判断条件。

双击打开Workflow1文件可以直接使用工作流工具来创建工作流程。在这Demo中使用了一个while循环(whileActivity1)和一个代码块(codeActivity1):


whileActivity1中的Condition属性设置为声明性规则条件,然后在Condition属性的下面会出现多两个属性,一个是ConditionName一个是Expression

点击ConditionName属性中的展开按钮[…],会出现选择条件对话框。点击[新建]按钮新建一个判断条件:!this.IsFixed

然后双击codeActivity1 ,进入codeActivity1ExecuteCode事件中:

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)

        {

            Console.WriteLine("继续循环?");

            Char C = Console.ReadKey().KeyChar;

            if (C == 'Y')

            {

                IsFixed = true;

            }

        }

然后可以在whileActivity1codeActivity1中设置断点。运行项目,就可以看见WF的运行方式了。