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的更多相关文章

  1. 【翻译习作】 Windows Workflow Foundation程序开发-第一章05

    1.3      开发我们的第一个工作流 也许你曾经在这样的产品经理手下搞过开发:他总是在你身边转悠,并不时的问一句“你还没做完吗?”.在这一部分,我们将用一个简单的Windows Workflow程 ...

  2. 【翻译习作】 Windows Workflow Foundation程序开发-第一章03

    1.2.2.Visual Studio 2005扩展包 微软也为Windows Workflow开发者提供了Visual Studio 2005扩展包.扩展包将许多功能集成到Visual Studio ...

  3. 【翻译习作】 Windows Workflow Foundation程序开发-第一章02

    1.2      Windows Workflow概览 微软的Windows Workflow Foundation(简称WF)是.NET框架3.0版的一部分..NET3.0其它主要部分是Window ...

  4. 【翻译习作】 Windows Workflow Foundation程序开发-第一章01

    第 1 章    欢迎来到工作流的世界 …思想如蝴蝶般飞到我身边 —— Gossard / Vedder (译注:Gossard与Vedder是来自Pearl Jam乐队的2名乐手,该句出自他们的歌曲 ...

  5. 【翻译习作】 Windows Workflow Foundation程序开发

    近期整理硬盘,把09年的翻译习作<Windows Workflow Foundation程序开发>找出来了.现在又把译文过了一遍,做了些修改,贴出来献丑了.原书是<Programmi ...

  6. 【翻译习作】 Windows Workflow Foundation程序开发-前言

    Windows Workflow Foundation程序开发-基于XAML和C#的WF实战技术与例程 ——C#程序员的WF功能与编程接口技术指导 前言 Windows Workflow Founda ...

  7. 你还记得windows workflow foundation吗

    很多年前,windows workflow foundation还叫WWF,而直译过来的名称让很多人以为它就是用来开发工作流或者干脆就是审批流的. 博主当年还是个懵懂的少年,却也知道微软不会大力推一个 ...

  8. Workflow-Microsoft:Windows Workflow Foundation

    ylbtech-Workflow-Microsoft:Windows Workflow Foundation 1. Windows Workflow Foundation返回顶部 1.1. Windo ...

  9. 微信小程序开发-第一弹

    前言:       本篇文章为大家详细介绍微信小程序开发第一篇,后续步骤会逐步更新,欢迎大家关注. 第一步  注册        1.1 打开网址 https://mp.weixin.qq.com/  ...

随机推荐

  1. SPOJ #500. Turbo Sort

    Sorting is not an out-dated topic. My own in-place qsort got TLE... so, I simply called stl::sort() ...

  2. Redis主从同步介绍

    Redis主从同步命令和配置项 启动主从复制:master无需任何操作,slave中使用以下任意一种开启复制功能 (1).通过配置文件启动主从复制: 在redis.conf中加入"slave ...

  3. bzoj2289: 【POJ Challenge】圆,圆,圆

    Description 1tthinking随便地画了一些圆. ftiasch认为这些圆有交集(面积非零)的可能性不大.因为他实在画了太多圆,所以你被请来判断是否存在交集. Input 第1行,一个整 ...

  4. Force IE to Open Link in New Tab

    1.First, open Internet Explorer and click on Tools and then Internet Options. 2.Now click on the Set ...

  5. 【MySQL】性能优化 之 延迟关联

    [背景]  某业务数据库load 报警异常,cpu usr 达到30-40 ,居高不下.使用工具查看数据库正在执行的sql ,排在前面的大部分是: SELECT id, cu_id, name, in ...

  6. OAF_VO系列1 - Accelerator Keys

    OAF_EO系列6 - Delete详解和实现(案例) (2014-06-16 08:37)

  7. bug_ _Popwindow被魅族手机自带虚拟键挡住完美解决

    ========  1 之前做了一个分享的功能,从底部弹出popwindow进行分享,但是由于部分手机自带虚拟键,如魅族X4,所以弹出的popwindow被虚拟键挡住, 在网上找了好多资料,一些资料说 ...

  8. Note++ 的快捷

    Notepad++绝对是windows下进行程序编辑的神器之一,要更快速的使用以媲美VIM,必须灵活掌握它的快捷键,下面对notepad++默认的快捷键做个整理(其中有颜色的为常用招数): Ctrl+ ...

  9. 转-Android微信支付

    http://blog.fangjie.info/android微信支付/ Android微信支付 2014-08-09 一.使用微信官方的提供的demo里的appid等 1.微信接口上手指南:(从“ ...

  10. [转]VGA、QVGA、CIF、QCIF 。。。的含义

    转自:http://www.360doc.com/content/07/0329/15/494_419655.shtml 相信大家时常都听到手机支持 VGA 镜头.QVGA 屏幕显示.CIF 短片拍摄 ...