首页 / 软件开发 / .NET编程技术 / WF从入门到精通(第六章):加载和卸载实例
WF从入门到精通(第六章):加载和卸载实例2010-06-03 cnblogs GuoYong.Che学习完本章,你将掌握:1.理解工作流实例为什么要卸载和重新加载及其时机2.理解工作流实例为什么要持久化及其时机3.搭建SQL Server 2005,使其为WF和工作流持久化提供支持4.使用SqlWorkflowPersistenceService服务5.在你的工作流代码中进行实例的加载和卸载6.使持久化服务能自动地加载工作流实例及卸载空闲中的工作流实例假如你花点时间真正考虑该怎样使用WF和工作流在你的应用程序中进行处理的话,你或许想像的许多解决方案中都包含那些需长时间运行的处理过程。毕竟,商业软件本质上就是模拟和执行业务处理过程,这些许多的处理过程中都包含人或厂商、订货和发货、计划安排等等。人没有在几毫秒内自动进行处理的响应能力,但在已加载的企业服务器上则能做到点。服务器是宝贵、繁忙的资源,需让它进行线程的轮转,让线程等待几分钟、几小时甚至几天、几周是不能接受的,原因有很多。因此WF的设计器必须提供一个机制,当等待一些长期运行的任务时,空闲工作流应暂时脱机。WF决定提供Microsoft SQL Server作为一个可选的存储介质,因为数据库是储存(而不是失去)宝贵数据的好地方。WF也集成了另一个可插拔服务,我们可轻易地把它纳入我们的工作流中以支持其持久化机制。怎么做到这些、为什么做、什么时候做是我们在本章中将探讨的问题。持久化工作流实例你知道现代Microsoft Windows操作系统本质上是一个非常特别的批处理软件,它负责为各请求线程分配占用处理器的时间吗?假如一个单一的线程独占了处理器一个过份的时间周期,其它线程会“饿死”,系统将会死锁。因此这个批处理软件,也就是任务调度程序,要把线程从处理器的执行堆栈上移进和移除,以便所有的线程都能得到执行时间。从某个意义上说,工作流也类似。假如你有许许多多长时间运行的工作流,它们都挂到某一特定的计算机上竞争处理时间和资源的话,那么系统最终会阻塞未处理的工作流。这就没有了可伸缩性。事实上,WF在维护它的工作流队列时是非常高效的,但你可能对这些必须有一个物理上的上限表示赞同,把空闲、长期运行的工作流从激活执行状态移除是一个好主意。或者发生什么意外,系统忽然被关闭呢?工作流完全在内存中处理,除非我们采取步骤持久化它们。因此,除非我们在突发事件发生之前有所准备,否则我们就将丢失了执行中的工作流实例。假如那些长期运行的工作流正管理着关键的进程,它们丢失了我们能承受得起吗?在大多数情况下,我们都承受不起,至少我们不会心甘情愿地允许这些进程在毫无防备措施的情况下就消失掉。好消息是WF不仅为您提供了卸载工作流实例,然后又重新加载的方法,它也支持一个服务:SqlWorkflowPersistenceService,它用来把工作流实例序列化进SQL Server数据库。假如你读过前面一章,你可能已经熟悉甚至对把工作流实例的信息写入数据库的主张感到满意。因此,在什么时侯卸载工作流实例,并且假如他们被卸载,我们应怎么持久化它们呢?在执行中有一些非常特别的点可卸载工作流实例。在大多数情况下,发生这种情况是在我们会自动为刚才我之所以提到的——WF不能离开(或不愿离开)长期运行的工作流程,在内存中不必要地消耗资源和处理时间的时候。但我们也能亲自进行控制。这里列出了工作流实例的卸载点,在那些地方可进行持久化。1.在ActivityExecutionContext完成并结束(卸载)后。我们在第四章(活动类型和工作流类型介绍)简要谈过ActivityExecutionContext对象。2.在Activity进入空闲状态时。3.一旦一个TransactionScopeActivity完成(卸载)时。我们将在第十五章(工作流和事务)看到这个活动。4.一旦一个带有PersistOnCloseAttribute属性的Activity完成。5.当你明确调用WorkflowInstance.Unload或WorkflowInstance.TryUnload时。通过调用WorkflowInstance对象的特定方法或通过使用一个Delay活动让你的工作流进入空闲状态,你可控制工作流实例被持久化的时机。在延时的时候,通过传递一个参数到持久化服务的构造函数中,你将可对自动的持久化行为进行控制。备注:暂停工作流实例和对工作流实例进行延时是不相同的。使用Delay活动将自动地把工作流实例写入数据库(前提是你正使用SqlWorkflowPersistenceService并已经对其进行配置,本章的最后一节将看到这些)。暂停仅仅是使工作流从激活的处理状态中撤出。然而你也可选择使用Unload或TryUnload以手动的方式把工作流写入到数据库中。WF是如何完成这些的呢?这通过使用SqlWorkflowPersistenceService并结合创建一个特定的数据库来完成这项任务(这非常像我们在前一章创建的跟踪数据库)。你可使用相关脚本来创建一个数据库的架构(表和视图)以及执行持久化所需的存储过程。首先让我们来创建数据库。