2012-09-18 151 views
2

我设置使用下面的代码测试控制台应用程序:有没有办法“调整”事件监听器被调用的顺序?

using System; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     var myEventGenerator = new EventGenerator(); 
     for (int i = 0; i < 10; i++) 
      new EventListener(myEventGenerator); 

     while (Console.ReadLine().Length == 0) 
      myEventGenerator.TriggerEvent(); 
    } 
} 

class EventListener 
{ 
    private static int numberOfInstances = 0; 
    private int instanceNumber; 

    public EventListener(EventGenerator eg) 
    { 
     eg.EventHappened += EventHappened; 
     instanceNumber = numberOfInstances++; 
    } 

    void EventHappened(object sender, EventArgs e) 
    { 
     Console.WriteLine("Event Caught in Instance " + instanceNumber); 
    } 
} 

class EventGenerator 
{ 
    public event EventHandler EventHappened; 

    public void TriggerEvent() 
    { 
     Console.WriteLine("Event Begin"); 
     if (EventHappened != null) 
      EventHappened.Invoke(this, new EventArgs()); 
     Console.WriteLine("Event End"); 
    } 
} 

和应用的输出为:

Event Begin 
Event Caught in Instance 0 
Event Caught in Instance 1 
Event Caught in Instance 2 
Event Caught in Instance 3 
Event Caught in Instance 4 
Event Caught in Instance 5 
Event Caught in Instance 6 
Event Caught in Instance 7 
Event Caught in Instance 8 
Event Caught in Instance 9 
Event End 

似乎事件侦听器是基于触发的顺序上,他们订阅的事件。

但是如果我不想让这些事件侦听器按照这个顺序发生怎么办?如果我想要它是随机的呢?或者,如果我想指定不同的顺序?有没有办法做到这一点?

回答

2

没有任何方法可以改变事件处理程序调用挂钩它的事件的顺序。查看this page了解更多信息。

这里是重要的片段:

委托实例,其调用列表包含每个调用的方法在 调用列表,同步,为了 多个条目收益的调用。所谓的每种方法是 都传递了与给代理 实例相同的一组参数。如果这样的委托调用包含引用参数 (第10.5.1.2节),则每个方法调用将以参考 发生到同一变量;通过 调用列表中的一种方法对该变量的更改将对调用 列表下方的方法可见。如果委托调用包含输出参数或返回值,则它们的最终值将来自调用列表中最后一个委托的 。

如果你想要这种类型的控件,你必须写一些类来为你做。

+0

+1链接。在那里执行的很好的例子描绘了代表们可能/不可能做到的事情。 –