Извините за поздний ответ.
Я столкнулся с ситуацией, когда мне приходится иметь дело с порядком обработчиков событий.
У меня есть форма, и когда я нажимаю кнопку на форме, объект добавляется в коллекцию где-то в моем коде.
В коллекции есть событие "Добавлено", и к нему подключены два делегата. Один из методов удаляет любой элемент, только что добавленный в коллекцию, а другой показывает сообщение пользователю.
Если у меня есть некоторый код, показанный здесь, исключение «IndexOutOfRange» будет генерироваться при запуске события:
// this methods hooks two delegates to MyCollection.Added event, but the order results in a "IndexOutOfRange" exception after the event is triggered
HookEvents()
{
MyCollection.Added += new CollectionItemAddedHandler(DeleteItem_After_CollectionItemAdded);
MyCollection.Added += new CollectionItemAddedHandler(ShowMessage_After_CollectionItemAdded);
}
// when user click a button on form, add a object to MyCollection
Button_Clicked()
{
MyCollection.Add(new object());
}
// at the moment a object is added into the collection, this method remove it
DeleteItem_After_CollectionItemAdded(NewIndexArgs e)
{
MyCollection.Remove(e.NewIndex); // e.NewIndex represents the newly added item index in current collection
}
// at the moment a object is added into the collection, this method show its information (hey, but remember, I just remove it in the previous method)
ShowMessage_After_CollectionItemAdded(NewIndexArgs e)
{
MessageBox.Show(MyCollection[e.NewIndex]); // tell user what is just added into the current collection
// a "IndexOutOfRange" exception is thrown here....
}
Что сделает этот сценарий корректным , так это то, что метод «ShowMessage_After_CollectionItemAdded» должен быть запущен first , а затем это будет метод «DeleteItem_After_CollectionAdded».
Хотя сначала мы можем + = метод «ShowMessage ...», иногда мы не можем предопределить эту последовательность до времени выполнения .