wf框架编程(Activity有限自动机和wf实例调度)

 

第二部分续

三、调度运行

1 WF运行时(WorkflowRuntime)

名称空间:System.Workflow.Runtime.WorkflowRuntime

文件:system.workflow.runtime.dll

要点:

1.驻留在CLR中,即CLR要实例化一个WorkflowRuntime对象

2WorkflowRuntime在宿主中以自已独立的线程运行例(详见wf线程模型部分)

3WorkflowRuntime可以加载多个工作流实例,每个工作流实例在WorkflowRuntime有独立的线程

4.同一宿主可以实例化多个WorkflowRuntime,他们可以同时工作

       带来的问题,wf加载部分要加锁。会对wf程序队列产生影响。

是服务容器,可以加入定义服务,wf运行时服务和向Activity提供的服务

wf框架编程(Activity有限自动机和wf实例调度)

 

具体推荐大家可以看看WXWinter的博客,他整理的资料很全也很好
http://www.cnblogs.com/foundation/articles/527854.html

2活动的有限自动机

2.1 Acitivity和CompositeAcitivity结构分析

wf框架编程(Activity有限自动机和wf实例调度)

    详细内容可以看WXWinter的博客, vs里面看看msdn帮助也是推荐的好方法

 

2.2 Acitivity自动机

       可以理解为Acitivity的生命周期

wf框架编程(Activity有限自动机和wf实例调度)


图片来源:Essential.Windows.Workflow.Foundation
 有些资料上:Suceeded画为Closed

2.3 调度器队列

       Wf调度器的工作队列,是非抢占模式。

2.4 Wf程序队列

       宿主和wf的通信通道wf框架编程(Activity有限自动机和wf实例调度)

wf框架编程(Activity有限自动机和wf实例调度)

图片来源:Essential.Windows.Workflow.Foundation
 

3 WF的调度

3.1 Wf的逻辑生命周期

wf框架编程(Activity有限自动机和wf实例调度)

                            参考Essential.Windows.Workflow

 

wf的逻辑生命周期不是ClR对象的生命周期,CLR是没有持久化的时候,暂时代表内存中的活动。活动执行的推动者是AECRuntime不关心每个Activity的状态。

3.2 Acitivity生命周期和WF实例逻辑生命周期的关系

wf框架编程(Activity有限自动机和wf实例调度)

图片来源:Essential.Windows.Workflow.Foundation

      Activity的生命周期:Initialize,Exeute,ContinueAt,OnClose,Uninitialize

重要:WF不关心下一个Acitivity时什么,以及何时流转

3.3 WF实例的生命周期

 wf框架编程(Activity有限自动机和wf实例调度)

图片来源:Essential.Windows.Workflow.Foundation

实例创建

 

       使用CodeDom或者直接激活的方式得到wf program prototype(可以理解为实例模板),再得到多个实例,实例元数据指向原型元数据。如果缓存中存在原型,直接创建,不存在就加入缓存。创建实例后要建立调度器,实例对象要绑定到调度器及AEC上。启动实例(star),就是在调度器工作队列中加入根节点的Exeute方法。

       加载器实现

wf框架编程(Activity有限自动机和wf实例调度)

 

WorkflowLoaderService的子类,可以自定义加载服务实现加载其它DSL定义的流程。

实例钝化

       是持久化保存和销毁(Workflow.Unload)的合并过程,这里只需要知道概念。详细过程参考:WF持久化部分。

实例暂停:

Instance.Suspend(string Error)或者SuspendActivity实现。暂停wf实例执行,实例仍会驻留在内存中,如果需要从内存卸载需要显式调用WorkflowInstance.Unload()方法。

Suspend后的实例,即使调度器队列中存在工作项,也并不执行。必须显式调用WorkflowInstance.Resume()后实例才能恢复执行。

挂起的相关信息可以通过Error属性传入,通过WorkflowSuspendEventArgs.Error属性。

实例中止:

Instance.Terminate(string Error)Terminate Activity实现。会触发WorkflowRuntimeWorkflowTerminated事件。事件参数WorkflowTerminateArgs会包含ExceptionWorkflowInstance。跟踪服务也能查询到此ExceptionInstance.Complete:触发运行时的WorkflowCompleted事件,WorkflowCompletedEventArgsOutputParameters是输出参数,根活动的所有公共属性可以通过这个获取。

Instance.Abort:触发运行时的WorkflowAbort事件,最近一次持久化后的工作被丢弃,实例移出内存。

3.4 wf实例状态机和Activity状态机的关系

       宿主调度实例的方法,实例进入某种状态,具体变化由Activity自己负责,Activity的状态反过来也影响到实例的状态(比如根活动Unintialize,实例进入Comleted状态)

实例的状态变化和某些行为都可以触发运行时事件。

4活动上下文ActivityExecutionContext

ActivityExecutionContextActivityExecutionContextManager

wf框架编程(Activity有限自动机和wf实例调度)

ActivityExecutionContext 的作用:

1.提供服务,实现了IServiceProvide接口,可以GetService得到WorkflowRuntime.AddService添加的服务

2.调度状态API,可以和调度器通讯

3.保存状态信息

例如:持久化时候需要保存的上下文(内部执行状态、调度器工作队列状态、事件的订阅信息)

AECManger.CompletExecutionContext -> Activity.OnActivityExeutionContextUnload;

wf框架编程(Activity有限自动机和wf实例调度)

ActivityExecutionContextManage 提供了create,complet,Get AEC 的能力。


你可能感兴趣的:(Activity)