WEB开发网
开发学院软件开发C语言 适合C# Actor的消息执行方式(2):C# Actor的尴尬... 阅读

适合C# Actor的消息执行方式(2):C# Actor的尴尬

 2010-09-30 20:50:29 来源:WEB开发网   
核心提示: 我们可以使用这种方式来实现一个乒乓测试,既然是Tag Message,适合C# Actor的消息执行方式(2):C# Actor的尴尬(3),那么定义一些Tag便是首要任务,Tag表示“做什么”,会将计数器减1,如果计数器为0,即消息的“功能”,在

我们可以使用这种方式来实现一个乒乓测试。既然是Tag Message,那么定义一些Tag便是首要任务。Tag表示“做什么”,即消息的“功能”。在乒乓测试中,有两种消息,共三个“含义”。Erlang使用原子作为tag,在.NET中我们自然可以使用枚举:

public enum PingMsg 
{ 
  Finished, 
  Ping 
} 
 
public enum PongMsg 
{ 
  Pong 
} 

在这里,我们使用简单的ActorLite进行演示(请参考ActorLite的使用方式)。因此,Ping和Pong均继承于Actor<Message>类,并实现其Receive方法。

对于Ping对象来说,它会维护一个计数器。每当收到PongMsg.Pong消息后,会将计数器减1。如果计数器为0,则回复一条PingMsg.Finished消息,否则就回复一个PingMsg.Ping:

public class Ping : Actor<Message> 
{ 
  private int m_count; 
 
  public Ping(int count) 
  { 
    this.m_count = count; 
  } 
 
  public void Start(Actor<Message> pong) 
  { 
    pong.Post(new Message(PingMsg.Ping, this)); 
  } 
 
  protected override void Receive(Message message) 
  { 
    if (message.Tag.Equals(PongMsg.Pong)) 
    { 
      Console.WriteLine("Ping received pong"); 
 
      var pong = message.Arguments[0] as Actor<Message>; 
      if (--this.m_count > 0) 
      { 
        pong.Post(new Message(PingMsg.Ping, this)); 
      } 
      else 
      { 
        pong.Post(new Message(PingMsg.Finished)); 
        this.Exit(); 
      } 
    } 
  } 
}

上一页  1 2 3 4 5 6 7  下一页

Tags:适合 Actor 消息

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接