技术开发 频道

本地服务之事件处理


【IT168技术文档】

  一:先来介绍两个活动 EventDrivenActivity和 ListenActivity。

  EventDrivenActivity是一个等侍事件触发的容器,EventDrivenActivity第一个子结点必需是一个继承 IEventActivity接口的Activity,后面所有的结点可以是任意Activity。该活动必须具有父级活动,它的父级活动可以是 ListenActivity,StateActivity或StateMachineWorkflowActivity。

  如果EventDrivenActvity在状态机工作流中使用,还有如下使用限制:

  1. EventDrivenActivity 可以并且只能包含一个实现了IEventActivity接口的Activity.如HandleExternalEvent或Delay。
  2. 如果有 HandleExternalEventActivity 必须是第一个结点.这是因为,Windows Workflow Foundation 实现的状态机工作流模型一次只处理一个EventDrivenActivity活动。例如,如果EventDrivenActivity 活动中包含多个能够运行的 IEventActivity 活动,则会出现以下情况:某个 EventDrivenActivity 活动在等待可能永远不会执行的IEventActivity 时被阻止。这样,状态机将无法处理任何其他消息。
  3. 一个StateActivity状态容器可以有多个EventDrivenActivity。

  ListenActivity属于单线触发容器,当某条分支中的结点执行完成后,该ListenActivity结点就结束,继续向下执行,其他分支内的结点就不执行了。EventDrivenActivity是它唯一可以添加的子活动,并且至少必须有两个子活动。该活动无法用于状态机工作流中。

  二:工作流能够使用方法和事件通过消息与宿主程序交互。 事件用于将数据发送到工作流,而工作流使用方法将数据发送到主机应用程序。在坚持学习WF(8):本地服务之调用外部方法这篇中我们说明了工作流如何使用本地服务来调用外部方法,接下来我们用一个猜数字游戏的小例子来主要说明在本地服务中如何使用事件。调用外部方法和事件处理基本的流程差不多。

  1.实现事件参数类,GuessReceivedEventArgs类需要继承自ExternalDataEventArgs类,ExternalDataEventArgs类中的instanceId可以保证正确的工作流实例来接收事件。

GuessReceivedEventArgs .cs using System; using System.Workflow.Activities; namespace GuessNumber { [Serializable] public class GuessReceivedEventArgs : ExternalDataEventArgs { private Int32 _nextGuess; public GuessReceivedEventArgs(Guid instanceId, Int32 nextGuess) : base(instanceId) { _nextGuess = nextGuess; } public Int32 NextGuess { get { return _nextGuess; } set { _nextGuess = value; } } } }

2.定义服务接口,代码如下
IGuessingGame.cs using System; using System.Workflow.Activities; namespace GuessNumber { [ExternalDataExchange] public interface IGuessingGame { void SendMessage(String message); event EventHandler<GuessReceivedEventArgs> GuessReceived; } }


3.实现本地服务,先定义一个事件参数。这个也继承自ExternalDataEventArgs,虽然它不是用在工作流中,但是我们为了使用InstanceId,所以也让它继承这个类。
MessageReceivedEventArgs .cs using System; using System.Workflow.Activities; namespace GuessNumber { [Serializable] public class MessageReceivedEventArgs : ExternalDataEventArgs { private String _message; public MessageReceivedEventArgs(Guid instanceId, String message) : base(instanceId) { _message = message; } public String Message { get { return _message; } set { _message = value; } } } }
  本地服务类,这类中共有四个成员:

  SendMessage:workflow使用,由工作流实例来调用,发送一个信息到宿主程序,并且激发MessageReceive事件。

  GuessReceived:workflow使用,接收下一个猜的数字,当OnGuessReceived方法调用的时候激发。

  MessageReceived:宿主使用,从工作流实例接收一个信息,通过SendMessage方法激发。

  OnGussReceived:宿主使用,发送一个新的猜的数字到工作流,会引发GuessReceived事件。
0
相关文章