Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 确定事件处理程序的优先级_C#_.net_.net 3.5_C# 3.0_Event Handling - Fatal编程技术网

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

C# 确定事件处理程序的优先级,c#,.net,.net-3.5,c#-3.0,event-handling,C#,.net,.net 3.5,C# 3.0,Event Handling,我有以下代码,其中我处理一个事件两次。但是,我始终希望确保mynewclass始终首先处理事件,然后触发本地事件处理程序代码。我知道MyClass事件应该首先触发,因为它是第一个创建的事件,但是因为线程和排队正在发生,我认为在我希望它这样做之前,它需要花费太长的时间,并且在myhandleeventlocal中做一些事情。我能等它发生吗 public MyMainClass { private MyMethod() { MyClass mynew

我有以下代码,其中我处理一个事件两次。但是,我始终希望确保
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关于:

[…]额外的代理将添加到列表末尾或从列表末尾删除[…]


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

如果您不能保证事件处理程序的添加顺序,只需为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();
    }
}
class-MyClass{
私有LinkedList事件处理程序;
公共枚举排序{First,Last,…};
public void AddHandler(MyEventHandler,订购单){
开关(命令){
案例排序。首先:
AddFirst(处理程序);
打破
//在这里填写其他情况。。。
}
}
公共无效RaiseEvent(){
//按顺序调用处理程序
foreach(eventHandlers中的MyEventHandler处理程序)
eventHandler();
}
}

关于siride解决方案,您还可以实现您的处理程序并以这种方式确定位置。比如颠倒顺序(总是在开始时添加)或添加一些逻辑。

尽管Jon是对的,但规范没有指定点火顺序。虽然我不希望微软改变游戏计划,但如果一个应用程序真的依赖于了解射击顺序,我们可以通过执行事件的
添加
删除
元素来控制执行。-1:你的代码没有编译。不应该!这是一个粗略的例子。