2010-07-29 63 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