У меня есть событие, например:
public event EventHandler<NewReadyMessageEventArgs> NewReadyMessage
Проблема в том, что мне нужно прикрепить к ней два обработчика, и мне нужно выполнить их один за другим (потому что последний зависит от первого). То есть Мне нужен определенный порядок выполнения обработчиков.
Я понимаю, что на самом деле обработчики будут выполняться один за другим, поэтому мне просто нужно прикрепить их в правильном порядке, но это будет очень ошибочный дизайн.
Я хочу создать отдельный обработчик и прикрепить его. В этом обработчике я просто хочу выполнить два моих обработчика в правильном порядке. Что вы думаете и что бы вы предложили?
Я бы не стал полагаться на внутреннюю реализацию, чтобы гарантировать, что обработчики будут вызваны в определенном порядке.
Если обработчики не могут знать друг о друге, но вам нужно, чтобы они выполнялись в определенном порядке, я бы создал обработчик "родительский", который вызывает другие два обработчика в правильном порядке.
Проблема в том, что мне нужно прикрепить к ней два обработчика, и мне нужно выполнить их один за другим (потому что последний зависит от первого)
В этом случае я переосмыслил бы ваш дизайн. Вероятно, для "первого" обработчика больше смысла поднимать собственное событие.
Второй обработчик может присоединяться к этому событию и иметь результаты обоих элементов.
Похоже, это может быть место, где вам просто нужно иметь несколько (2) событий.
Если порядок важен, есть два события, и один из них просто запускается сразу после другого. Вы можете увидеть это, например, в жизненном цикле страницы в ASP. Есть много событий, и в некоторых случаях все они увольняются один за другим с вещью, находящейся между ними, кроме гарантии того, что все обработчики предыдущего события запущены. Это звучит так же, как и ваше дело.
Я бы предложил реализовать свою собственную реализацию 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
, если вам нужен конкретный заказ...