现在的位置: 首页 > 综合 > 正文

Activity、 IEventActivity、 IActivityEventListener

2012年04月19日 ⁄ 综合 ⁄ 共 5721字 ⁄ 字号 评论关闭

Activity表示工作流的基本构造块,任意类那样定义一组属性和事件,并定义执行逻辑,这些逻辑定义活动的运行时行为。是所有活动的基类。

    所有活动共享一组在 Activity 基类上定义的通用属性。每个 Activity 都可以按照需要,通过扩展此类来声明各自的附加属性。因为 Activity 派生自 DependencyObject,所以属性可以定义为标准 CLR 属性和依赖属性。

    此示例定义用于发送电子邮件的活动。该活动定义一个在相应实现中使用依赖属性的 Subject 属性。可以采用类似的方法定义其他属性。对 Execute 方法进行重写,以提供用于发送电子邮件的逻辑。

     

    IEventActivity提供必须从中派生事件驱动活动的方法和属性,以便可以订阅事件。

     

    IComparable QueueName { get; } //

    获取该活动正在等待其数据到达的 WorkflowQueue 的名称。

    源文档 <http://www.cnblogs.com/foundation/archive/2008/06/11/1217345.html?login=1#commentform>

  1. IEventActivity活动放入在ListenActivity中时,ListenActivity启动时首先调用Subscribe方法,表示开始订阅事件,可在这儿做初始化工作。
  2. ListenActivity活动从消息队列中收到一条消息时,它将调用Unsubscrible方法,表示已经收到消息,可在此方法中从消息队列中读取消息
  3. ListenActivity中的IEventActivity活动的执行过程为

    Subscribe()

    Unsubscribe()

    Execute()

    不在ListenActivity中的活动的执行过程为

    Execute()

    等待 Queuing 事件

    当自定义活动作为EventDrivenActivity的一个子活动时,一个事件驱动的活动内部处理过程如下:

  4. Intialize方法首先被执行,使用户有机会完成内部的任何初始化操作。
  5. 定义在IEventActivity中的Subscribe()被执行,父活动(比如ListenActivity或者是EventDrivenActivity)作为parentEventHandler参数被传入,使开发人员有机会创建一个命名的工作流队列并且订阅到工作流队列的QueueItemAbailable事件。订阅的目的在于通知父活动一个新的消息到达队列。
  6. 当一个新的消息到达队列时,父活动得到通知。
  7. Unsubscribe方法被执行,可以在该方法中从父活动益处事件订阅。
  8. Execute被执行,此时应该从工作流队列中取出一个消息来执行。当然活动的工作流执行完成时,应该返回活动的状态为ActivityExcursionStatus.Closed,指示活动完成。
  9. 当自定义的事件驱动活动直接放在工作流上时:

  10. Intialize方法首先被执行
  11. Excute被执行
  12. 新的消息到达队列 后,OnEvent被执行。
  13.  

     

    IActivityEventListener<QueueEventArgs>

    //实现IActivityEventListener<QueueEventArgs> 的[发生订阅事件时的处理过程]事件方法

    public void OnEvent(object sender, QueueEventArgs e)

     

    前文中提到的工作流队列先简单说一下:

    WF运行时引擎提供了一个内部机制用来处理调度和通信,消息使用一个队列名字被放入一个工作流队列中,并在稍后从队里中取出。压入的消息可以是被序列化的类型。

    WF自带的标准事件驱动和ExternalDataExchangeService内部都使用工作流队列来和外部通信,比如当在本地服务中触发一个事件。这个事件被放入一个工作流队列,当HandleExternalEventActivity接收通知,被告之在队列中有一个新的消息可用,该事件将从队里中取出并得以处理。

    在工作流实例或者是自定义活动的内部,一个WorkflowQueue类表示一个命名队列。该类实现了一个基本的方法与队列交互,比如EnqueuepeekDequeue等。还有当一个新的消息可用于处理时,触发QueueItemAvailable事件,或者当一个队列中的消息传送过来时,可处理QueueItemArrived事件。

     

    宿主应用程序或本地服务可以向队列中加入消息以便让工作流实例使用。这是通过使用WorkflowInstance类的EnqueueItem或者EnqueueItemIdle()方法实现的。

     

    深入了解一下IEventActivityIActivityEventListener:事件驱动的活动有些特别,因为其并不是立即就得执行,而是通过注册一个事件,然后等待事件的触发。为了定义一个事件驱动的活动,应该实现IEventActivity接口。该接口定义了一个事件驱动活动的必须实现的契约。定义了SubscribeUnsubscribe方法用于处理事件注册过程。这些方法被当前活动的父活动所利用。SubscribeUnsubscribe方法传递了一个实现了IActivityEventListener接口的对象。IEventActivity也定义了一个名为QueueName的属性用于返回活动将用于接收消息的队列的名称。

    IEventActivity并没有定义如何接受事件通知,留给了IActivityEventListener接口来实现。因此一个事件驱动的活动应该也要实现IActivityEventListener接口。IActivityEventListener定义了一个OnEvent()方法,当一个新的事件被接收并用于处理时,调用该方法。当开发一个基于队列的事件驱动活动时,事件参数应该总是类型QueueEventArgs

    一般情况下,一个事件驱动的活动都被放在EventDrivenAcitivity中(或者有一个ListenActivityEventDrivenActivity组成的复合活动),然而,一个自定义的事件驱动的活动也可以直接被用于工作流中,使其在EventDrivenActivity的外面。

     自定义的Activity

      

     

    例子

    基于ASP.NET的工作流(WF)审批应用程序

    实现IEventActivity  

     

     

抱歉!评论已关闭.