我使用以下代码设置了测试控制台应用程序:
using System;
class Program
{
static void Main(string[] args)
{
var myEventGenerator = new EventGenerator();
for (int i = 0; i < 10; i++)
new EventListener(myEventGenerator);
while (Console.ReadLine().Length == 0)
myEventGenerator.TriggerEvent();
}
}
class EventListener
{
private static int numberOfInstances = 0;
private int instanceNumber;
public EventListener(EventGenerator eg)
{
eg.EventHappened += EventHappened;
instanceNumber = numberOfInstances++;
}
void EventHappened(object sender, EventArgs e)
{
Console.WriteLine("Event Caught in Instance " + instanceNumber);
}
}
class EventGenerator
{
public event EventHandler EventHappened;
public void TriggerEvent()
{
Console.WriteLine("Event Begin");
if (EventHappened != null)
EventHappened.Invoke(this, new EventArgs());
Console.WriteLine("Event End");
}
}
应用程序的输出是:
Event Begin
Event Caught in Instance 0
Event Caught in Instance 1
Event Caught in Instance 2
Event Caught in Instance 3
Event Caught in Instance 4
Event Caught in Instance 5
Event Caught in Instance 6
Event Caught in Instance 7
Event Caught in Instance 8
Event Caught in Instance 9
Event End
似乎事件侦听器是根据他们订阅事件的顺序触发的。
但是如果我不希望那些事件监听器以该顺序发生怎么办?如果我想让它随机怎么办?或者,如果我想指定不同的订单?有没有办法做到这一点?
答案 0 :(得分:2)
没有任何方法可以更改事件处理程序调用连接到它的事件的顺序。查看this page了解详情。
以下是重要的摘录:
调用其调用列表包含的委托实例 通过调用中的每个方法继续多个条目 调用列表,按顺序同步。所谓的每种方法都是 传递给代表的同一组参数 实例。如果这样的委托调用包括引用参数 (第10.5.1.2节),每个方法调用都会带有引用 到同一个变量;通过一个方法更改该变量 调用列表将在调用后面的方法中可见 名单。如果委托调用包含输出参数或a 返回值,它们的最终值将来自于调用 列表中的最后一位代表。
如果你想要这种控制,你必须写一些为你做的事情。