1

マルチキャスト デリゲートの呼び出しリストは、一定時間の挿入と削除をサポートするリンク リストとして実装されていることを理解していたので、最初はイエスだと思っていました。ただし、マルチキャスト デリゲートは不変であるため、追加/削除操作を行うには、実際には呼び出しリストをコピーする必要があるようです。これは正しいですか、何か不足していますか?

さまざまな短命オブジェクトのハンドラーをイベントに頻繁に登録し、それらが破棄される直前に登録解除する長時間実行アプリケーションがあるため、登録/登録解除のコストは重要です。呼び出しリストはかなり長くなる可能性があるため、これを一定時間の操作にしたいと考えています。

4

2 に答える 2

2

呼び出しリストはかなり長くなる可能性があるので、これを定数時間の操作にする必要があります。

「かなり」の長さはどれくらいですか?あなたが何千もの加入者について話しているのでない限り、それはかなりの期間である可能性は低いです。

テストプロジェクトを立ち上げて試してみてください。実際の測定値は、賢い老人(または女性)の数に勝っています。

アップデート

1つの考え:オブジェクトが廃棄されるときの特定のケースの場合は、次のようなものを試してください。

public event PropertyChanged
{
    add { mPropertyChanged += value; }
    remove { mPropertyChanged -= value; }
}

public void Dispose()
{
    mPropertyChanged = null;
}

あなたのDispose方法では、保存されたイベントへの参照を削除するだけで、1回のヒットですべてのサブスクリプションを破棄できます。これは間違いなく、1つずつ購読を解除するよりも高速です。

はい、ガベージコレクターへのマルチキャストデリゲートを放棄していますが、購読を解除すると、とにかくそれを実行します。実際には、購読解除ごとに1回です。

于 2011-08-22T21:30:59.750 に答える
1

Has Passant のコメントによると、11 年 8 月 22 日 21:31

追加は償却された O(1) であり、List<>.Add() とまったく同じロジックです。削除はO(n)です。これは変更できません。

于 2016-09-28T18:55:33.373 に答える