Compartilhar via


WF-全扫描(2)-WF程序实例的持久化

如上一篇博文所述,所谓持久化,就是把一个WF程序实例存储到(持久)存储介质中,并将其从内存中移除的过程。在这之后,实例可以重新载入到内存并恢复执行。一个已经钝化的WF程序实例可以在另一个不同的WF运行时中恢复执行,也可以在另一个CLR应用程序域中恢复执行,甚至是在另一台机器上恢复执行。

WF运行时环境里有一个叫做持久化的运行时服务,它可以将实例保存到存储器中,以及从存储器中加载实例。如果WF不提供这项功能,工作流就不能实现持久化,没有了钝化的功能。WF运行时类库中System.Workflow.Runtime.Hosting命名空间包含一个名叫sqlWorkflowPersistenceService服务。

各位在写工作流程序的时候要充分利用persistant活动的用法和原理。

通常来说,要持久化一个WF实例适当这个实例处于空闲状态。当WF程序实例中调度器的工作队列为空,我们就认为该实例为空闲,在没有外部信号的情况下,该实例不会继续处理工作。

我们在写工作流程序的时候,需要在工作流空闲的时候钝化,如何实现呢,下面两点简短的文字予以说明:

1.当实例空闲的时候,WF运行时通过WorkflowSchedulerService所获得的用于分派工作项的那个线程就会返回到宿主程序中,但是WF实例任然逗留在内存中.

2.此时,WF运行时会触发一个WorkflowRuntime.WorkflowIdled事件。宿主程序可以通过发现这个事件,并且在事件处理器中调用WorkflowInstance的Unload方法,这样就可以在工作流空闲的时候把工作流实例持久化存储到数据库中。