2012-09-18 152 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鏈接。在那裏執行的很好的例子描繪了代表們可能/不可能做到的事情。 –