代码之家  ›  专栏  ›  技术社区  ›  Jon

确定事件处理程序的优先级

  •  2
  • Jon  · 技术社区  · 16 年前

    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
    
             }
    
        }
    

    更新:我已经更新了我的问题和代码来演示这个问题。

    4 回复  |  直到 16 年前
        1
  •  6
  •   Mark Byers    16 年前

    违约 事件处理程序是按照您添加它们的顺序调用的,因此如果您总是按照您希望它们激发的顺序添加处理程序,那么它应该可以工作。

    从乔恩·斯凯特关于 events and delegates :

    注意:您可以通过更改 add remove 操作来指定其他行为。然后可以将事件处理程序保存在一个列表中,由您自己管理,并根据您喜欢的任何规则处理触发顺序。

        2
  •  3
  •   ChrisF    16 年前

    mynewclass 然后在那个代码中调用另一个代码。

        3
  •  2
  •   siride    16 年前

    由于事件处理程序是按您添加它们的顺序调用的,因此基于我在您的问题中看到的代码,不能先调用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();
        }
    }
    
        4
  •  0
  •   Michele Di Cosmo    16 年前