【翻译习作】 Windows Workflow Foundation程序开发-第一章04
1.2.3 Windows Workflow运行时
从Windows Workflow的角度看,可以将工作流活动当成是交给一个工作流处理器去执行的一系列指令或操作码。在Windows Workflow中,这个处理器就是WF运行时(WF runtime)。为了启动一个工作流,我们首先需要一个宿主来承载运行时和工作流服务。
1.2.3.1 承载Windows Workflow运行时
Windows Workflow不是一个单独运行的软件。像ASP.NET那样,WF存在于多个程序集中(最重要的就是System.Workflow.Runtime.dll这个程序集)。像ASP.NET运行时那样,WF需要一个宿主进程来加载、初始化和启动它的运行时,随后才是工作流粉墨登场。然而,不同于ASP.NET那样的传统服务器端应用,WF可以在许多不同种类的宿主中运行。例如,我们可以在智能客户端应用、控制台应用或者Windows服务中承载WF。
下面的类图展示的就是在WF中执行工作流所必需的类。
为了准备工作流的执行环境,我们要先生成一个WorkflowRuntime类的实例,然后调用其StartRuntime方法。WorkflowRuntime类定义了一些可以对运行环境进行定制化的方法。该类中也定义了一些事件,我们可以在运行期间对它们进行侦听。当工作流处于结束、中止、空闲等不同状态时,运行时都会引发相应的事件。
当我们创建好了运行时的实例,就可以用它的CreateWorkflow方法来生成工作流。CreateWorkflow的返回值是一个WorkflowInstance类对象。WorkflowInstance类代表了一个单独的工作流。通过调用工作流实例对象的Start方法就可以启动这个工作流。如果出现了异常,工作流将调用Terminate方法(该方法将导致运行时抛出一个WorkflowTerminated事件)。下图展示了一个典型的调用顺序。
WorkflowRuntime和WorkflowInstance几乎是运行期间最重要的两个类,但它们不是仅有的两个类。在WF程序集中,还有其它的类为工作流运行时提供一些重要的服务。这些服务将在第5章里给予详细的说明,下面只是提供一个简短的介绍。
1.2.3.2 运行时服务
WorkflowRuntime仅仅提供了用于执行工作流的基本功能。我们在前面曾经谈到了一些应该由工作流引擎实现的重要功能,比如对运行中的工作流进行追踪的功能,以及对空闲工作流实行失活操作的功能。别担心,在WorkflowRuntime类的扩展机制——AddService方法中,这些功能都是可用的。
AddService允许我们为运行时提供一个或多个服务。这些服务可以是我们为特定的应用域编写的自定义服务,比如自定义调度服务,也可以是微软在WF中提供的现成的服务。让我们先看看目前都有哪些现成可用的服务。
调度服务
第一种调度服务能够对工作流运行时使用的那些工作流执行线程实施控制。这种服务是由DefaultWorkflowSchedulerService类实现的。通过它,我们可以创建新的工作流执行线程。因为这些线程是与宿主程序相分离的,所以工作流以异步方式执行,不会阻塞任何宿主程序的线程。工作流执行线程的最大并发数值是可以通过配置来设定的。
另一种调度服务是由ManualWorkflowSchedulerService类提供的,当宿主程序希望为工作流运行时提供线程时,我们就会用到这种服务。在ASP.NET Web应用和Web Service这类服务器端应用中,为运行时提供线程是一项非常有用的技术。服务器端应用通常每次都是从线程池中取出一个响应线程来为一个客户请求提供服务。宿主程序可以把这个响应线程继续借给WF运行时去同步地执行工作流。这种做法是有实际意义的,因为这样就不需要为每个客户请求提供2个处理线程了(译者注:一个线程响应客户请求,另一个线程执行工作流),可以降低对系统可伸缩性方面的要求。
如果WF内建的调度服务无法满足需求,你也可以自行定义调度服务。这一点对其它WF内建服务同样适用。
事务服务
事务服务,就像其名称所揭示的,能够让一个正在运行时中执行的工作流与其在持久存储器中的副本之间保持状态上的一致,这个持久存储器可以是关系型数据库。默认的事务服务是由一个DefaultWorkflowTransactionService类实例提供的。如果把一个服务提供给一个运行中的工作流实例,那么这个服务与工作流中的所有活动将共享同一个事务上下文。
WF是依靠.NET的System.Transactions命名空间来实现事务服务的。Transaction类提供了一种轻量级、自动登记、可提升的事务处理功能。它起初作为本地事务运行,如果需要的话,运行时可以在随后将其提升为一个重量级的分布性事务。
持久化服务
持久化服务负责将工作流的状态保存到持久存储器中。由SqlWorkflowPersistenceService类提供的服务可以将工作流状态存储到一个SQL Server数据库中。长期运行的工作流需要持久化,因为我们无法容忍一个发票处理工作流一直在内存中运行30天,而这期间它几乎什么也不做,只是在等待一个用户的付款到账。实际上在这种情况下,运行时会将这个工作流状态保存到持久存储器中,然后把它的实例从内存中卸载掉。在30天内(我们希望时间会更短些),运行时可以重新加载这个工作流实例并继续执行下去。如果已经配置了持久化服务,WF运行时会自动对处于空闲或挂起状态的工作流执行持久化操作。
SqlWorkflowPersistenceService类能够与SQL Server 2000或更新版本的Microsoft SQL Server(包括免费的MSDE和Express版本)协同工作。当然,我们还需要持久化服务能够识别的数据库架构。在第5章里,我们会学习如何使用.NET 3.0提供的T-SQL安装脚本来完成与持久化服务相关的数据库设置。
追踪(Tracking)服务
调度服务负责为工作流选择一个执行线程,而追踪服务则负责监视和记录工作流的执行信息。追踪服务将所需的工作流信息类型以追踪配置的形式通知给运行时。这种配置一旦建立好,追踪服务就能够打开一个追踪通道开始接收事件和数据。第5章里会有更详细的关于追踪配置和通道的内容。
WF提供了一个能够将追踪数据保存至SQL Server数据库的追踪服务类,SqlTrackingService。这个服务借助前面讨论过的事务服务来确保追踪数据与目标工作流的状态保持一致。默认情况下,运行时不会启动追踪服务,但是我们可以通过编码的方式为运行时添加这项服务(或者通过一个应用程序配置文件对追踪服务进行配置)。
到目前为止,我们已经了解了WF的所有基本功能,下面让我们开始运行工作流软件吧。
章节链接:
【翻译习作】 Windows Workflow Foundation程序开发
【翻译习作】 Windows Workflow Foundation程序开发-前言
【翻译习作】 Windows Workflow Foundation程序开发-第一章01
【翻译习作】 Windows Workflow Foundation程序开发-第一章02
【翻译习作】 Windows Workflow Foundation程序开发-第一章03
【翻译习作】 Windows Workflow Foundation程序开发-第一章04的更多相关文章
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章05
1.3 开发我们的第一个工作流 也许你曾经在这样的产品经理手下搞过开发:他总是在你身边转悠,并不时的问一句“你还没做完吗?”.在这一部分,我们将用一个简单的Windows Workflow程 ...
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章03
1.2.2.Visual Studio 2005扩展包 微软也为Windows Workflow开发者提供了Visual Studio 2005扩展包.扩展包将许多功能集成到Visual Studio ...
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章02
1.2 Windows Workflow概览 微软的Windows Workflow Foundation(简称WF)是.NET框架3.0版的一部分..NET3.0其它主要部分是Window ...
- 【翻译习作】 Windows Workflow Foundation程序开发-第一章01
第 1 章 欢迎来到工作流的世界 …思想如蝴蝶般飞到我身边 —— Gossard / Vedder (译注:Gossard与Vedder是来自Pearl Jam乐队的2名乐手,该句出自他们的歌曲 ...
- 【翻译习作】 Windows Workflow Foundation程序开发
近期整理硬盘,把09年的翻译习作<Windows Workflow Foundation程序开发>找出来了.现在又把译文过了一遍,做了些修改,贴出来献丑了.原书是<Programmi ...
- 【翻译习作】 Windows Workflow Foundation程序开发-前言
Windows Workflow Foundation程序开发-基于XAML和C#的WF实战技术与例程 ——C#程序员的WF功能与编程接口技术指导 前言 Windows Workflow Founda ...
- 你还记得windows workflow foundation吗
很多年前,windows workflow foundation还叫WWF,而直译过来的名称让很多人以为它就是用来开发工作流或者干脆就是审批流的. 博主当年还是个懵懂的少年,却也知道微软不会大力推一个 ...
- Workflow-Microsoft:Windows Workflow Foundation
ylbtech-Workflow-Microsoft:Windows Workflow Foundation 1. Windows Workflow Foundation返回顶部 1.1. Windo ...
- 微信小程序开发-第一弹
前言: 本篇文章为大家详细介绍微信小程序开发第一篇,后续步骤会逐步更新,欢迎大家关注. 第一步 注册 1.1 打开网址 https://mp.weixin.qq.com/ ...
随机推荐
- WinForm窗体拖动代码
本文转载自:http://www.cnblogs.com/ap0606122/archive/2012/10/23/2734964.html using System; using System.Co ...
- 51nod1039 x^3 mod p
X*X*X mod P = A,其中P为质数.给出P和A,求<=P的所有X. Input 第1行:一个数T,表示后面用作输入测试的数的数量.(1 <= T <= 1000) 第2 ...
- 51nod1369 无穷印章
有一个印章,其完全由线段构成.这些线段的线足够细可以忽略其宽度,就像数学上对线的定义一样,它们没有面积.现在给你一张巨大的白纸(10亿x10亿大小的纸,虽然这个纸很大,但是它的面积毕竟还是有限的),你 ...
- python之pexpect模块
最近在看<Python自动化运维技术与最佳实战>这本书,学到了一个运维中用到的模块:pexpect 下面是其定义: Pexpect 是一个用来启动子程序并对其进行自动控制的 Python ...
- android学习笔记24——事件处理
事件处理 android提供了两种事件处理机制: 1.基于回调的事件处理 2.基于监听器的事件处理(通过绑定特定事件监听器) 注意: android对于基于回调的事件处理而言,主要做法就是重写andr ...
- nginx的https配置
测试自签名的ssl证书 首先执行如下命令生成一个key openssl genrsa -des3 - 然后他会要求你输入这个key文件的密码.不推荐输入.因为以后要给nginx使用.每次reload ...
- C#使用ConditionalAttribute特性来实现代码调试
转自:http://www.csharpwin.com/csharpspace/10729r8541.shtml #if/#endif条件编译常用来由同一份源代码生成不同的结果文件,最常见的有debu ...
- PLSQL_Oracle面试整理(汇总)
2014-08-16 Created By BaoXinjian
- Condition的优点
那么引入本篇的主角,Condition,Condition 将 Object 监视器方法(wait.notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现 ...
- c#4
float translation = Time.deltaTime * 10; transform.Translate(0, 0, translation);//沿z轴移动 public cla ...