2010-07-29 3 views
2

У меня есть следующий код, где я обрабатываю событие дважды. Однако я всегда хочу убедиться, что mynewclass всегда обрабатывает событие первым, а затем запускается код локального обработчика событий. Я понимаю, что событие MyClass должно запускаться первым, так как оно создано первым, но из-за того, что происходит поток и enqueuing, я думаю, что он занимает слишком много времени и делает что-то в 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 

     } 

    } 

UPDATE: Я обновил свой вопрос и код, чтобы продемонстрировать эту проблему.

+0

-1: Ваш код не компилируется. –

+0

Его не должны! Это пример. – Jon

ответ

6

По умолчанию обработчики событий вызываются в порядке их добавления, так что если вы всегда добавлять обработчики в порядке, вы хотите, чтобы стрелять, то он должен работать.

Из статьи Джона Скита на events and delegates:

[...] дополнительные делегаты как добавляются и удаляются с конца списка [...]

Примечание: может переопределить поведение событий по умолчанию, изменив операции и remove на ваше событие, чтобы указать другое поведение. Затем вы можете сохранить обработчики событий в списке, который вы управляете собой, и обрабатывать порядок стрельбы на основе любых правил, которые вам нравятся.

+5

Хотя Джон прав, спецификация не указывает порядок стрельбы. Хотя я не ожидаю, что MS изменит план игры, если приложение действительно зависит от знания порядка стрельбы, мы берем на себя управление исполнением, реализуя элементы 'add' и' remove' этого события. – kbrimington

+0

@kbirmington: +1 Хорошая точка, добавлено. –

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

упс! отметчики уже сказали, что ...;) –

Смежные вопросы