0

私は電車と駅の出発案内板をモデリングするソフトウェアを書いています。列車は予定より何分進んだか遅れているかを記憶します。出発ボードの各インスタンスは、絶えず変化する列車のサブセットをサブスクライブします。

私たちは、数万の列車と数十万 (場合によっては数百万) の出発ボードを処理できるようにアプリケーションを作成しています。

登録している各発車案内板への参照リストを列車に保持させるのではなく、.NET イベントを使用することを計画しました。列車のスケジュールに関する情報が変更されるたびに、train クラスのインスタンスがイベントを発生させます。Departure Board クラスの各インスタンスは、サブスクライブしている列車のイベント リスナーを追加または削除するだけです。

イベントが持つことができるリスナーの数に制限はありますか? もしそうなら、制限は何ですか?また、パフォーマンスはどのように低下​​しますか?

ありがとう、リク

4

2 に答える 2

2

さて、これがデリゲートに百万のハンドラーを追加するいくつかのコードであり、それはうまく機能します:

Action<int> action = n => Console.WriteLine(n);

for (var i = 0; i <= 1000000; i++)
{
    var i2 = i;
    action += n => Console.WriteLine(n + i2);
}

action(42);

ただし、イベントを処理するために、生のイベントではなく、MicrosoftのReactiveExtensionsを使用することを検討します。デリゲートを使用すると、話している規模であらゆる種類の集計とフィルタリングを実行することが非常に困難になります。

于 2012-11-23T11:27:46.510 に答える
1

イベントが持つことができるリスナーの数に制限はありますか?

どのくらいのメモリを持っていますか?;p あなたが話している数値に関しては、それで問題ないはずですが、率直に言って、それは素晴らしいアプローチだとは思いません。しかし:

static void Main()
{
    EventHandler handler = null;
    for (int i = 0; i < 6000000; i++)
    {
        var obj = new Spoof();
        handler += obj.Bar;
        if ((i % 1000) == 0) Console.WriteLine(i);
    }
    Console.WriteLine("done");
    Console.ReadKey();
    handler(null, null);

}
class Spoof
{
    public void Bar(object sender, EventArgs args) { Console.WriteLine("hi"); }
}

もしそうなら、制限は何ですか?パフォーマンスはどのように低下​​しますか?

基本的にはほぼ直線。

ただし、このアプローチが理想的だとは本当に思いません。単一のアプリ ドメインに制限される (ノード間の分散が困難になる) などの問題があり、次のようなイベントを使用すると、予期しないメモリ シナリオが非常に簡単に発生します。それ。また、購読者リストをスキャンする必要があるため、購読解除にはかなりの費用がかかります。

個人的には、redis pub/sub などの専用の pub/sub システムを使用していました。ボードは、関心のある列車 (または路線) を購読し、列車 (または路線) はそれらの名前付きチャンネルにブロードキャストするだけです。

于 2012-11-23T11:31:00.723 に答える