WF-Activities之EventDrivenActivity ListenActivity

来源:互联网 发布:一起走软件刷步数 编辑:程序博客网 时间:2024/05/01 16:57

EventDrivenActivity一个容器,该容器内的第一个结点必需是一个继承 IEventActivity接口的Activity(可以进入idle状态的Activity,DelayHandExternalEvent),后面所有的结点可以是任意Activity IEventActivity 阻塞一些没解决的状态,如一个时间状态或一个外部消息的到来。当event完成,IeventActivity 完成运行,后面所有的Activity将执行

 

EventDrivenActivity一般用在以下两个部分

一是做为状态机结点 ,但是做为状态机结点是,这个EventDrivenActvity会有一些限制。那就是在 EventDrivenActvity容器中HandleExternalEventActivity 必须是第一个结点。

 

二是在ListenActivity中作为分支容器
 

分析下面流程:


我们采用ListenActivity做为容器,在ListenActivity这一节中,我们说过ListenActivity有着以下的特点单线触发容器,使用EventDrivenActivity作为分支容器,当某条分支中的结点执行完成后,该ListenActivity结点就结束,继续向下执行,其他分支内的结点就不执行了

 

我们在程序中:

将第一分支中的delayActivity1TimeoutDuration属性设为00:00:06,将第二分支中delayActivity2的属性设为00:00:05,而第三分支则用handleExternalEvent监听对应的事件。

 

到这里,我们可以知道我们这样做的结果是:当你在00:00:05之前触发了handleExternalEvent监听的事件时,工作流进入第三分支,执行完codeActivity3中的程序,工作流就结束了;如果没有触发事件,那么工作流进入第二分支,执行完codeActivity2中的程序,工作流就结束了;也就是第一分支永远不会执行。

 

事实实现在程序确实达到了这个效果,但实现在发现的过程中发现了这样一个问题,当第二分支结束完,我再去触发第三分支的事件,这时工作流就出现了以下异常

Event "SubmitedMethod" on interface type "TestLocalService.ITestLocalServeice" for instance id "c968093d-16f3-4b48-94f6-372fc48a6c4e" cannot be delivered

 

出现这个问题有两个原因:

 

第一个原因就是我们在handleExternalEvent中提过的,参数没有序列化的原因。在"innerException "中如果看见了“EventArgs not serializable”,那就是这个原因了

 

第二个原因就是工作流实例快已经被执行完了,因为工作流运行时不知道这个工作流已经执行完了,这时候工作流运行时会从WorkflowPersistenceServices这里找这个工作流实例,但很明显后者不存在的。在“innerException”中如果见了“The workflow hosting environment does not have a persistence service as required by an operation on the workflow instance "SomeId".,那就是这个原因了
下载