вызывается только один обработчик событий C#

Мое (по общему признанию шаткое) понимание состоит в том, что вы должны иметь возможность добавлять любое количество делегатов к событию C#, и все они вызываются (в каком-то неопределенном порядке). Но, похоже, это не так в моем проекте. У меня это сводится к двум делегатам, добавленным к событию Activated NSButton (это в MonoMac), например:

nsButton = new NSButton(new System.Drawing.RectangleF(0, 0, 100, 100));
nsButton.StringValue = "Click me!";

nsButton.Activated += delegate(object sender, EventArgs e) {
    Console.WriteLine("Handler 1!");
};
nsButton.Activated += delegate(object sender, EventArgs e) {
    Console.WriteLine("Handler 2?");
};

(а затем эта кнопка, конечно, добавляется в окно). Когда я нажимаю на нее, я вижу "Handler 1!" но я не вижу "Handler 2?" появляются в консоли. Если я закомментирую строки, добавляющие обработчик 1, то сработает обработчик 2.

Он ведет себя так, как будто работает только первый добавленный делегат, а все последующие игнорируются. Но это бросает вызов всему, что я могу найти о том, как должны работать события в C#. Что я делаю неправильно?


person Joe Strout    schedule 02.05.2014    source источник
comment
Подумайте о том, чтобы посмотреть на источник (при условии, что вы можете получить его или использовать что-то вроде ILSpy для декомпиляции) - поскольку ответ Servy (+1) указывает, что вы описали поведение по умолчанию, которое не обязательно использовать для управления.   -  person Alexei Levenkov    schedule 02.05.2014
comment
Да, я искал источник, но так и не нашел его. Я подозреваю, что это действительно что-то особенное для NSButton, потому что практически тот же код, подключенный к событию TouchUpInside UIButton на iOS, работает нормально.   -  person Joe Strout    schedule 02.05.2014
comment
С некоторой помощью Xamarin мне удалось обновить MonoMac до Xamarin.Mac. Но это поведение такое же. До сих пор не удалось найти официального слова или документации о том, является ли это предполагаемым поведением.   -  person Joe Strout    schedule 08.05.2014


Ответы (2)


На самом деле это баг. Я подал сюда:

https://bugzilla.xamarin.com/show_bug.cgi?id=19619

person chamons    schedule 08.05.2014

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

person Servy    schedule 02.05.2014