Что делать, если мне нужно выполнить обработчики событий в определенном порядке?

2

У меня есть событие, например:

public event EventHandler<NewReadyMessageEventArgs> NewReadyMessage

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

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

Я хочу создать отдельный обработчик и прикрепить его. В этом обработчике я просто хочу выполнить два моих обработчика в правильном порядке. Что вы думаете и что бы вы предложили?

  • 6
    Может быть, вы должны прикрепить только один обработчик, а этот сам вызывает второй?
  • 0
    @UweKeim первый обработчик не должен знать о втором обработчике.
Показать ещё 4 комментария
Теги:

4 ответа

2
Лучший ответ

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

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

7

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

В этом случае я переосмыслил бы ваш дизайн. Вероятно, для "первого" обработчика больше смысла поднимать собственное событие.

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

  • 0
    если идет дождь, открой зонт и иди домой. Вы предлагаете мне идти домой каждый раз, когда я открываю зонтик?
  • 0
    @javapowered Если вы хотите гарантировать, что вы не пойдете домой, пока ваш зонт не будет открыт, я бы посоветовал вам «идти домой каждый раз, когда зонт открывается из-за дождя» - то есть: Umbrella.Opened может сказать, что он открывается из-за дождь.
Показать ещё 5 комментариев
0

Похоже, это может быть место, где вам просто нужно иметь несколько (2) событий.

Если порядок важен, есть два события, и один из них просто запускается сразу после другого. Вы можете увидеть это, например, в жизненном цикле страницы в ASP. Есть много событий, и в некоторых случаях все они увольняются один за другим с вещью, находящейся между ними, кроме гарантии того, что все обработчики предыдущего события запущены. Это звучит так же, как и ваше дело.

0

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

Для получения дополнительной информации см. http://msdn.microsoft.com/en-us/library/cc713648.aspx

Если это не было очевидно, если вы не используете делегат многоадресной рассылки по умолчанию, вызов подписчиков должен быть реализован вручную. В приведенной выше ссылке описывается, как написать пользовательский add/remove для использования делегата многоадресной рассылки. Этот ответ предполагает, что вы не используете делегат многоадресной передачи. Например, что-то вроде:

   private List<EventHandler> eventList = new List<EventHandler>();

   public event EventHandler Event1 
   {
      add { eventList.Add(value); }
      remove { eventList.Remove(value); }
   }

    private void RaiseEvent1()
    {
        foreach(var e in eventList)
        {
            e(this, EventArgs.Empty);
        }
    }

Используйте SortedList, если вам нужен конкретный заказ...

  • 0
    Это не поможет, вы меняете добавление / удаление, а не выполнение.
  • 0
    @CodingGorilla Ну, если не использовать «многоадресную рассылку по умолчанию», он не будет вызывать подписки на события с делегатом многоадресной рассылки и делать это с помощью какого-то собственного алгоритма (который он на самом деле не детализировал). Так что да, это помогает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню