2

我使用以下代码设置了一个测试控制台应用程序:

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

似乎事件侦听器是根据他们订阅事件的顺序触发的。

但是,如果我不希望这些事件侦听器按该顺序发生怎么办?如果我希望它是随机的怎么办?或者,如果我想指定不同的顺序?有没有办法做到这一点?

4

1 回答 1

2

没有任何方法可以更改事件处理程序调用与其挂钩的事件的顺序。查看此页面了解更多信息。

这是重要的片段:

其调用列表包含多个条目的委托实例的调用通过按顺序同步调用调用列表中的每个方法来进行。每个所谓的方法都传递给委托实例的相同参数集。如果这样的委托调用包含引用参数(第 10.5.1.2 节),则每次方法调用都会引用同一个变量;调用列表中的一种方法对该变量的更改将对调用列表下方的方法可见。如果委托调用包含输出参数或返回值,则它们的最终值将来自列表中最后一个委托的调用。

如果你想要这种控制,你必须编写某种类来为你做这件事。

于 2012-09-18T16:28:10.303 回答