WF从入门到精通(第三章):workflow实例2010-06-03 cnblogs GuoYong.Che学习完本章,你将掌握:1.使用不带参数和带参数二种方式初始化一个workflow实例2.测定你运行中的workflow实例的状况3.停止workflow实例4.确定你的workflow空闲或终止的原因一个workflow实例由一个或多个活动组成。(我们将在第七章开始介绍各种活动:“Basic Activity Operations.”)“primary activity”或者“root activity”被称作“workflow definition”。“workflow definition”通常的行为是为其它将要工作的活动充当一个容器。注:“workflow definition”是你要求workflow去执行的东西,而一个workflow实例是一个正在执行的“workflow definition”。它们之间有明显的区别,一个正在执行当中,而另一个则不是。workflow实例从哪里来?它们当然应由你来创建。如你有困难来完成这个任务,并且自动创建的workflow符合你的应用要求的话,也可由软件来完成,但至少你也要写出workflow的任务或者workflow运行时将为你执行的任务。Microsoft提供了workflow运行时,你还得创建余下的东西。毕竟,这是你的应用。WF在上述这些地方的创建上可以为你提供帮助,WF不仅将执行你创建的workflow实例,而且也将帮助你去创建它们。WF集成了丰富的图形界面设计器,它能帮你以相同的方式把workflow集成到你创建的ASP.NET Web Forms、Windows Forms或者WPF应用中。你可在工具箱上滚动鼠标,从许多活动项中选中一个,然后把它拖到设计界面上并释放它。假如这个活动项具有可配置的属性,你还可使用Visual Studio中的属性面板来配置它,使它符合你的意图。我们已在第一章简要地使用过workflow设计器,在这里我们将再次使用它,毕竟与WF相关的工作几乎全是创建workflow任务,workflow可视化设计器的使用是开发过程中巨大的一个组成部分。workflow实例和任何其它软件类似。它们会开始执行、运行,直到遇到终止条件时终止。这些或许是数据库中的所有记录已被处理,所有需被压缩的档案已被压缩,或者workflow发向各个审批方的文档已被批复(同意或不同意),或者是处理已经完成。它只有一个正常的启动位置,但有一个或多个正常的可能停止的位置。实例也能维持错误、异常。你可以处理这些异常也可不处理它。在某些情况下,或许你不想去处理出现的异常,并留到以后进行处理。有时,一个workflow处理过程会执行很长很长时间才能完成。例如,一个处理过程发送了一份零件的订单并等待订单被接收。在workflow终止前须确认零件的型号和数目,而这或许会花去几天,几周甚至几月。因此,难道一个workflow实例也需要在内存里维持激活状态几天,几周或者几月吗?假如服务器崩溃或电源断电怎么办?你的workflow实例、数据、应用程序状态不是通通丢失了吗? workflow实例和组成实例的活动是workflow处理过程中的重要部分。WF已经为workflow实例的创建及执行提供了强大的支持。我们就来看看WorkflowInstance对象。WorkflowInstance对象介绍workflowInstance是一个WF对象,它为你提供了你的独立的workflow任务上下文(环境)。你可使用这个对象去找到在你的处理任务中事情将是如何进行的。就像我们有方法和属性去控制workflow运行时一样,我们也有方法和属性并用它们和我们的workflow实例进行交互。表3-1列出了大多数WorkflowInstance属性,表3-2列出了经常使用的方法。我们还将在第五章看到一些额外的属性和方法,“工作流跟踪”。 表3-1 WorkflowInstance的属性
属性 | 功能 |
InstanceId | 得到workflow实例的唯一标识(一个Guid) |
WorkflowRuntime | 得到本workflow实例的WorkflowRuntime |
表3-2 WorkflowInstance的方法
方法 | 功能 |
ApplyWorkflowChanges | 通过WorkflowChanges对象申请对workflow实例进行更改。这允许你在workflow执行时修改它(增加、移出或更改活动),当动态的更改实施时,workflow实例会被暂停。 |
GetWorkflowDefinition | 检索本workflow实例的根(root)活动。 |
Resume | 恢复执行先前被暂停的workflow实例。假如workflow实例并未处于暂停状态,则不做任何事情。假如workflow实例处在暂停状态,workflow运行时就会在workflow实例刚被恢复后触发WorkflowResumed事件。 |
Start | 启动一个workflow实例的执行,在这个workflow实例根活动上调用ExecuteActivity。假如Start发生异常,它通过调用Terminate终止这个workflow实例,并附加异常相关信息作为终止的原因。 |
Suspend | 同步暂停本workflow实例。假如workflow实例本就处于暂停状态,则不做任何事情。假如workflow实例正在运行,则workflow运行时就暂停该实例,然后设置SuspendOrTerminateInfoProperty(说明原因)并进入Suspend,触发WorkflowSuspended事件。 |
Terminate | 同步终止本workflow实例。当宿主需要终止workflow实例时,workflow运行时就终止这个实例并试图持久化实例的最终状态。然后WorkflowInstance设置SuspendOrTerminateInfoProperty(说明原因)并进入Terminate。最后,它触发WorkflowTerminated事件并把终止原因传到WorkflowTerminateException中的Message属性并包含到WorkflowTerminatedEventArgs事件参数中。另外,假如在持久化时发生异常,workflow运行时取而代之地就把异常传到WorkflowTerminatedEventArgs事件参数中。 |
还有更多和WorkflowInstance相关的方法还未列出。到第六章“实例的加载和卸载”,我们持久化工作流到数据库中时将看到他们的更多细节。