簡體   English   中英

優先處理事件處理程序

[英]Prioritising Event Handlers

我有以下代碼,我處理一個事件兩次。 但是,我總是希望確保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

         }

    }

更新:我已更新我的問題和代碼以證明問題。

默認情況下 ,事件處理程序按您添加它們的順序調用,因此如果您始終按照您希望它們觸發的順序添加處理程序,那么它應該可以工作。

來自Jon Skeet關於活動和代表的文章:

[...]額外的代表被添加到列表的末尾並從中刪除[...]

注意:您可以通過更改事件的addremove操作來覆蓋事件的默認行為,以指定其他一些行為。 然后,您可以將事件處理程序保存在您自己管理的列表中,並根據您喜歡的規則處理觸發順序。

如果您不能保證訂單將添加事件處理程序,只需為mynewclass添加一個,然后在該代碼中調用其他代碼。

由於事件處理程序是按照您添加它們的順序調用的,因此根據我在您的問題中看到的代碼,您無法首先調用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();
    }
}

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM