EventDrivenActivity一个容器,该容器内的第一个结点必需是一个继承 IEventActivity接口的Activity(可以进入idle状态的Activity,如Delay或HandExternalEvent),后面所有的结点可以是任意Activity。 IEventActivity 阻塞一些没解决的状态,如一个时间状态或一个外部消息的到来。当event完成,IeventActivity 完成运行,后面所有的Activity将执行
EventDrivenActivity一般用在以下两个部分
一是做为状态机结点 ,但是做为状态机结点是,这个EventDrivenActvity会有一些限制。那就是在 EventDrivenActvity容器中HandleExternalEventActivity 必须是第一个结点。
我们采用ListenActivity做为容器,在ListenActivity这一节中,我们说过ListenActivity有着以下的特点单线触发容器,使用EventDrivenActivity作为分支容器,当某条分支中的结点执行完成后,该ListenActivity结点就结束,继续向下执行,其他分支内的结点就不执行了
我们在程序中:
将第一分支中的delayActivity1的TimeoutDuration属性设为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”,那就是这个原因了
下载