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)、各メソッド呼び出しは同じ変数への参照で発生します。呼び出しリスト内の1つのメソッドによるその変数への変更は、呼び出しリストのさらに下のメソッドに表示されます。デリゲート呼び出しに出力パラメーターまたは戻り値が含まれている場合、それらの最終値は、リスト内の最後のデリゲートの呼び出しから取得されます。

この種の制御が必要な場合は、それを実行するある種のクラスを作成する必要があります。

于 2012-09-18T16:28:10.303 に答える