2010-07-29 77 views
2

我有下面的代碼,我在處理事件的兩倍。不過,我總是希望確保mynewclass總是先處理事件,然後觸發本地事件處理程序代碼。我明白了MyClass的事件應該首先開火,因爲這是第一次創建一個,但因爲線程和入隊正在發生,我認爲它的時間太長及其在做myhandleeventlocal東西之前,我希望它這樣做。任何方式,我可以等待它發生?優先化事件處理程序

public MyMainClass 
    { 

    private MyMethod() 
    { 
     MyClass mynewclass = new MyClass(); 
     mynewclass.myObject += MyHandler(myhandleventlocal); 
     mynewclass.loadedevent += EventHandler(loadedevent) 
    } 

    private void myhandleventlocal() 
    { 

      //do stuff 

    } 

    private void loadedevent() 
    { 
     //do some stuff 
    } 

    } 

    public MyClass 
    { 
     public MyObject myObject; 
     public event loadedevent; 
     public MyClass() 
     { 
       myObject = new MyObject(); 
       myObject += MyHandler(myhandlevent); 

     } 

     private void myhandlevent(long value, string detail) 
     { 

      //Start a thread 
      //Enqueue value and detail 
      //On seperate thread dequeue value and process it 
      //Raise loadedevent event 

     } 

    } 

更新:我更新了我的問題和代碼來演示問題。

+0

-1:您的代碼不編譯。 – 2010-07-29 18:11:51

+0

它不應該!這是一個粗略的例子。 – Jon 2010-07-29 18:34:27

回答

6

通過默認事件處理程序被調用的順序添加它們,所以如果你總是在順序添加處理程序,你想他們會火,那麼它應該工作。

從喬恩斯基特的文章events and delegates

[...]額外的代表都加入並從列表末尾刪除[...]

注意:可以通過更改事件的addremove操作來指定其他某些行爲,從而覆蓋事件的默認行爲。然後,您可以將您的事件處理程序保存在您自己管理的列表中,並根據您喜歡的任何規則處理點火順序。

+5

雖然Jon的權利,規範並沒有指定射擊順序。雖然我不指望MS改變遊戲計劃,但如果一個應用程序真的依賴於瞭解點火順序,我們通過實現事件的「add」和「remove」元素來控制執行。 – kbrimington 2010-07-29 15:27:56

+0

@kbirmington:+1好點,補充。 – 2010-07-29 15:29:45

3

如果你不能保證事件處理程序將被添加的順序,只需添加一個mynewclass,然後在該代碼調用其他代碼。

2

由於調用事件處理程序中添加的順序,根據我在你的問題中看到的代碼,你不能讓mynewclass的處理程序首先調用。 MyClass創建的事件處理程序始終先添加。

一個解決方案是爲事件處理程序的控制優先。除了使用內置事件處理程序+ =/- =運算符外,您還可以使用方法來添加和刪除可明確指定排序的事件。這樣,如果一個班級知道需要首先處理該事件,它可以要求這樣做。不過,要小心,因爲你很容易遇到多個班級都堅持要先處理事件的情況。

下面是一些快速和骯髒的代碼,讓你開始:

class MyClass { 
    private LinkedList<MyEventHandler> eventHandlers; 
    public enum Ordering { First, Last, ... }; 
    public void AddHandler(MyEventHandler handler, Ordering order) { 
     switch(order) { 
      case Ordering.First: 
       eventHandlers.AddFirst(handler); 
       break; 
      // fill in other cases here... 
     } 
    } 
    public void RaiseEvent() { 
     // call handlers in order 
     foreach(MyEventHandler handler in eventHandlers) 
      eventHandler(); 
    } 
} 
0

參考siride解決方案,還可以實現你的處理程序,並決定位置的方式。就像反轉順序(總是在開始處添加)或添加一些邏輯。

+0

哎呀!馬克·拜爾斯已經說過......;) – 2010-07-29 18:06:29