只调用一个c#事件处理程序

本文关键字:一个 事件处理 程序 调用 | 更新日期: 2023-09-27 18:01:16

我的理解是,您应该能够向c#事件添加任意数量的委托,并且它们都被调用(以某种未定义的顺序)。但在我的项目中,情况似乎并非如此。我已经把它归结为两个委托添加到一个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?");
};

(然后这个按钮被添加到一个窗口,当然)。当我单击它时,我看到"处理程序1!",但我没有看到控制台出现"处理程序2?"。如果注释掉添加处理程序1的行,则触发处理程序2。

它的行为就好像只有第一个添加的委托有效,任何后续的都被忽略。但这违背了我所能找到的关于c#中事件应该如何工作的一切。我做错了什么?

只调用一个c#事件处理程序

这实际上是一个bug。我把它归档在这里:

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

值得注意的是,您描述的是事件应该如何表现,而不是它们必须如何表现。定义事件的类型如果愿意,可以忽略这些准则,并且不会保留多个处理程序。但这并不是你会在几乎所有事件中看到的行为,因为它们必须走出自己的方式来产生这种行为。