2014-04-02 119 views
0

我有下面的代码,一个节拍器类在3秒钟的时间点创建事件,并且一个Listener类听到节拍器滴答,并在每次接收到事件时向控制台打印“滴答” 。我还想要做的是在“Tick”之前或之后链接进一步的事件,我应该能够处理其他事件,我在控制台窗口上看到的输出是这样的:事件处理,如何链接事件

“已处理的初始事件” “勾选” “已处理最终事件”

这可能吗?

namespace Events 
{ 
    using System; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var m = new Metronome(); 
      var l = new Listener(); 
      l.Subscribe(m); 
      m.Start(); 
     } 
    } 

    public class Metronome 
    { 
     public EventArgs e = null; 
     public delegate void TickHandler(Metronome m, EventArgs e); 
     public event TickHandler Tick; 

     public void Start() 
     { 
      while (true) 
      { 
       System.Threading.Thread.Sleep(3000); 
       if (Tick != null) 
       { 
        Tick(this, e); 
       } 
      } 
     } 
    } 

    public class Listener 
    { 
     public void Subscribe(Metronome m) 
     { 
      m.Tick += new Metronome.TickHandler(HeardIt); 
     } 

     private void HeardIt(Metronome m, EventArgs e) 
     { 
      Console.WriteLine("Ticked"); 
     } 
    } 
} 
+0

混乱的标题,你只有一个单一的事件。 – Maarten

+0

我目前有一个单一的事件,我的问题是关于如何改变它,所以这可以处理多个事件。 – 03Usr

回答

1

您可以自己添加事件处理程序。

var m = new Metronome(); 
m.Tick += (s, e) => { 
    Console.WriteLine("Processed initial event"); 
}; 
var l = new Listener(); 
l.Subscribe(m); 
m.Tick += (s, e) => { 
    Console.WriteLine("Processed the final event"); 
}; 
m.Start(); 

这应该会给你想要的结果。请记住,下令在其中添加的事件是为了使它们在执行

或者,如果你想多听众:

public class Listener { 
    private string _msg; 
    public Listener (string msg) { 
     _msg = msg; 
    } 

    public void Subscribe(Metronome m) { 
     m.Tick += new Metronome.TickHandler(HeardIt); 
    } 

    private void HeardIt(Metronome m, EventArgs e) { 
     Console.WriteLine(msg); 
    } 
} 

var m = new Metronome(); 
new Listener("Processed initial event").Subscribe(m); 
new Listener("Ticked").Subscribe(m); 
new Listener("Processed the final event").Subscribe(m); 
m.Start();